详解php的魔术方法__get()和__set()使用介绍

发布网友 发布时间:2022-04-06 01:03

我来回答

2个回答

懂视网 时间:2022-04-06 05:25

php对魔术方法的认识:1、【_set】属性不存在时自动设置属性;2、【__get】属性不存在或不能读取时,设置该方法可读取;3、【__call】方法不存在时,执行;4、【__callStatic】静态方法不存在时,执行。

php对魔术方法的认识:

1、_set:属性不存在时自动设置属性

/**
* 属性不存在时通过__set自动设置属性
* @param $key [键名]
* @param $value [属性值]
*/
function __set($key,$value){
$this->arr[$key] = $value;
}
 
代码:
$object->title = 'blue'; //设置不存在的属性,调用__set()
echo $object->title,'<br/>'; //输出不存在的属性,调用__get()
 
输出:
blue

2、__get:属性不存在或不能读取时,设置该方法可读取

/**
* 属性不存在或不能读取(属性为私有private)时,通过__get读取
* @param $key 键名
* @return 属性
*/
function __get($key){
return $this->arr[$key];
}

3、__call:方法不存在时,执行

/**
* 方法不存在时,执行__call方法
* @param $func [方法名]
* @param $param [参数]
* @return [description]
*/
function __call($func,$param){
var_dump($func);
echo '<br/>';
var_dump($param);
echo '<br/>';
}
 
代码:
$object -> show('hello','world'); //调用不存在的方法,调用__call()
 
输出:
string(4) "show"
array(2) { [0]=> string(5) "hello" [1]=> string(5) "world" }

4、__callStatic:静态方法不存在时,执行

/**
* 静态方法不存在时,执行__callStatic方法
* @param $func [方法名]
* @param $param [参数]
* @return [description]
*/
static function __callStatic($func,$param){
var_dump($func);
echo '<br/>';
var_dump($param);
echo '<br/>';
}
 
代码:
IMoocObject::show('hello','world'); //调用不存在的静态方法,调用__callStatic()
 
输出:
string(4) "show"
array(2) { [0]=> string(5) "hello" [1]=>string(5) "world" }

5、__toString:当对象转换为字符串时,执行

/**
* 当对象转换为字符串时,执行__toString方法
* @return string [description]
*/
function __toString{
return __CLASS__;
}
 
代码:
echo $object,'<br/>'; //将对象以字符串形式输出,调用__toString()
 
输出:
IMoocObject

6、__invoke:当把对象当成函数来使用时,执行

/**
* 当把对象当成函数来使用时,执行__invoke方法
* @param [type] $param [参数]
* @return [type] [description]
*/
function __invoke($param){
var_dump($param);
}
 
代码:
echo $object('hello'); //将对象当函数使用,调用__invoke()
 
输出:
string(5) "hello"

相关免费学习推荐:php编程(视频)

热心网友 时间:2022-04-06 02:33

先看看php官方文档的解释:
__set()
is
run
when
writing
data
to
inaccessible
properties.
__get()
is
utilized
for
reading
data
from
inaccessible
properties.
究竟用中文怎么翻译呢?
inaccessible
:n.
难达到;难接近;无法理解。
有代码有*:
复制代码
代码如下:
<?php
error_reporting(E_ALL);
class
stu{
private
$a;
private
$b
=
0;
public
$c;
public
$d
=
0;
//这里的
private
可以用
protected
public
替代
private
function
__get($name)
{
return
123;
}
//这里的
private
也可以用
protected
public
替代
private
function
__set($name,
$value)
{
echo
"This
is
set
function";
}
}
$s
=
new
stu();
var_mp($s->a);
//output:
123
var_mp($s->b);
//output:
123
var_mp($s->c);
//output:
null
var_mp($s->d);
//output:
0
var_mp($s->e);
//output:
123
$s->a
=
3;
//output:
This
is
set
function
$s->c
=
3;
//no
output
$s->f
=
3;
//output:
This
is
set
function
?>
结果分析:
如果没有__get方法,执行
var_mp($s->a)
var_mp($s->b)
会有致命的错误
如果没有__get方法,执行
var_mp($s->e)
会有一个notice,提示没有定义属性
$e
总结:
1.
从一个难以访问的属性读取数据的时候
__get()
方法被调用
2.
向一个难以访问的属性赋值的时候
__set()
方法被调用
3.
难以访问包括:(1)私有属性,(2)没有初始化的属性
4.
__isset()
__unset()
也类似

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com