gpt4 book ai didi

PHP __get 和 __set 魔术方法

转载 作者:IT老高 更新时间:2023-10-28 11:56:55 25 4
gpt4 key购买 nike

除非我完全弄错了,否则 __get__set 方法应该允许重载 → getset .

例如,以下语句应该调用 __get 方法:

echo $foo->bar;
$var = $foo->bar;

并且下面应该使用 __set 方法:

$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 是公开的,因此不可访问。

section on Property Overloading in the manual:

  • __set() is run when writing data to inaccessible properties.
  • __get() is utilized for reading data from inaccessible properties.

魔术方法不能替代 getter 和 setter。它们只允许您处理方法调用或属性访问,否则会导致错误。因此,还有更多与错误处理相关的内容。另请注意,它们比使用正确的 getter 和 setter 或直接方法调用要慢得多。

关于PHP __get 和 __set 魔术方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4713680/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com