一尘不染

PHP __get和__set魔术方法

php

除非我完全误解,否则__getand __set方法应该允许→ get和的重载set

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


阅读 251

收藏
2020-05-26

共1个答案

一尘不染

__get__set__call__callStatic当该方法或属性是不可访问的被调用。您$bar是公开的,因此并非无法访问。

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

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

2020-05-26