如果未调用__set,则不会调用__get,但代码有效吗?

Kor*_*gay 6 php get set magic-methods

这是我的代码:

<?php

class SampleClass {

    public function __get($name){
        echo "get called";
        echo $name;
    }

    public function __set($name, $value) {
        echo "set called";
    }

}

?>
Run Code Online (Sandbox Code Playgroud)

我的索引文件:

$object = new SampleClass();
$object->color = "black";
echo $object->color;
Run Code Online (Sandbox Code Playgroud)

如果我按原样运行此代码,则输出如下:

set calledget calledcolor

但是,如果我发表评论

public function __set($name, $value) {
    echo "set called";
}
Run Code Online (Sandbox Code Playgroud)

上面的部分(只有这部分),然后输出将是:

black

那么这里发生了什么?

dat*_*age 3

这是对正在发生的事情的解释。在你的第一个例子中。您从未将值存储在对象中,也不存在声明的属性。这echo $object->color;实际上从未执行任何操作,因为 . 没有返回任何内容__get

在第二个示例中,您为对象中的属性分配了一个值。由于您没有在对象中声明该属性,因此默认情况下会将其创建为公共属性。由于它是公开的,因此__get在访问它时永远不会被调用。

  • @hek2mgl 不。预期是在_任何分配给不可访问的成员_时调用`__set`,因为[这就是文档所说的](http://bg2.php.net/manual/en/language.oop5.overloading。 php#object.set)。一个不存在的成员肯定是无法访问的。您可以在“__set”方法中自行实现此类属性的动态创建,但如果它“确实”在调用“__set”方法之前自动发生,您将“没有办法禁用它”。 (3认同)