PHP__get和__set魔术方法

2022-08-30 07:56:26

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

例如,以下语句应调用该方法:__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


答案 1

__get、,并在方法或属性不可访问时调用。您是公开的,因此并非无法访问。__set__call__callStatic$bar

请参阅手册中有关属性重载的部分:

  • __set()在将数据写入无法访问的属性时运行。
  • __get()用于从无法访问的属性中读取数据。

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


答案 2

我建议使用数组通过 存储所有值。__set()

class foo {

    protected $values = array();

    public function __get( $key )
    {
        return $this->values[ $key ];
    }

    public function __set( $key, $value )
    {
        $this->values[ $key ] = $value;
    }

}

通过这种方式,您可以确保无法以其他方式访问变量(请注意,这是受保护的),以避免冲突。$values


推荐