为了账号安全,请及时绑定邮箱和手机立即绑定

PHP __get和__set魔术方法

PHP __get和__set魔术方法

PHP
慕尼黑的夜晚无繁华 2019-09-21 15:12:29
除非我完全误解,否则__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。
查看完整描述

3 回答

?
青春有我

TA贡献1784条经验 获得超8个赞

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


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


__set() 将数据写入不可访问的属性时运行。

__get() 用于从无法访问的属性读取数据。

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


查看完整回答
反对 回复 2019-09-21
?
呼如林

TA贡献1798条经验 获得超3个赞

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


class foo {


    protected $values = array();


    public function __get( $key )

    {

        return $this->values[ $key ];

    }


    public function __set( $key, $value )

    {

        $this->values[ $key ] = $value;

    }


}

这样,您可以确保不能以其他方式(请注意$values受保护)访问变量,以避免冲突。


查看完整回答
反对 回复 2019-09-21
  • 3 回答
  • 0 关注
  • 395 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信