首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >PHP __get和__set的神奇方法

PHP __get和__set的神奇方法
EN

Stack Overflow用户
提问于 2011-01-17 21:30:44
回答 4查看 175.9K关注 0票数 88

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

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

代码语言:javascript
复制
echo $foo->bar;
$var = $foo->bar;

下面的代码应该使用__set方法:

代码语言:javascript
复制
$foo->bar = 'test';

这在我的代码中是不起作用的,并且可以通过这个简单的例子重现:

代码语言:javascript
复制
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]";

这只会导致:

代码语言:javascript
复制
[test]

在其中放置一些die()调用表明它根本没有命中它。

现在,我只是说去它的吧,我现在在需要的地方手动使用__get,但这不是非常动态的,需要知道除非特别调用,否则“重载”代码实际上是不会被调用的。我想知道这是不是不应该以我所理解的方式工作,或者为什么它不工作。

这是在php 5.3.3上运行的。

EN

回答 4

Stack Overflow用户

发布于 2011-01-17 21:37:05

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

代码语言:javascript
复制
class foo {

    protected $values = array();

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

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

}

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

票数 39
EN

Stack Overflow用户

发布于 2011-01-17 21:36:15

这是因为$bar是公共财产。

代码语言:javascript
复制
$foo->bar = 'test';

在运行上面的代码时,不需要调用魔术方法。

从类中删除public $bar;应该会纠正这个问题。

票数 5
EN

Stack Overflow用户

发布于 2011-01-17 21:36:43

删除public $bar;声明,它应该会像预期的那样工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4713680

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档