发布日期:2018-03-26
PHP中__get和__set的魔术方法+ 查看更多
PHP中__get和__set的魔术方法
+ 查看更多
发布日期:2018-03-10 15:32
分类:PHP
浏览次数:111
除非我完全错了,__get和__set方法应该允许重载get和set方法。
例如,以下语句应调用__get方法:
例如,以下语句应调用__get方法:
echo $foo->bar; $var = $foo->bar;
并且以下应该调用__set方法:
现在,我在需要使用的地方手动使用__get方法,但是这种方式不是很灵活,需要特别调用,否则'重载'代码实际上没有被调用。我想知道这是否不是以我理解的方式运行,为什么这不起作用。
代码运行在php 5.3.3版本中。
请参阅手册中的属性重载部分:
$foo->bar = 'test';但是,这在我的代码中无法工作,下面是这个简单的例子:
class foo { public $bar; public function __get($name) { echo "Get:$name"; return $this->$name; } public function __set($name, $value) { echo "Set:$name to $value"; $this->$name = $value; } } $foo = new foo(); echo $foo->bar; $foo->bar = 'test'; echo "[$foo->bar]";这只会输出:
[test]把die()函数放在代码中,结果显示它根本没有调用这两个方法。
现在,我在需要使用的地方手动使用__get方法,但是这种方式不是很灵活,需要特别调用,否则'重载'代码实际上没有被调用。我想知道这是否不是以我理解的方式运行,为什么这不起作用。
代码运行在php 5.3.3版本中。
回答
_get,_set,__call和__callStatic在方法或属性不可访问时才能被调用。你的$bar是公共的,因此不能调用这些方法。请参阅手册中的属性重载部分:
__set()用于向不可访问的属性写入数据。 __get()用于从不可访问的属性读取数据。魔术方法不是getter和setter方法的替代。它们只允许您处理方法调用或属性访问,否则会导致错误。因此,它们更多的与错误处理相关。还要注意,它们比使用正确的getter和setter或直接方法调用慢得多。