某些名称__get不能工作两次

时间:2014-10-01 09:33:42

标签: php yii magic-methods

我知道这是一个奇怪的设置,但我试图避免一些神奇的Yii如此热爱。

class myActiveRecord extends CActiveRecord
{
    public function __get($name) {
        $method = 'get' . ucfirst($name);
        if(method_exists($this, $method)) {
            $backtrace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS);
            foreach($backtrace  as $b) {
                if($b['function'] == $method) {
                    return parent::__get($name);
                }
            }

            return $this->$method();
        }

        return parent::__get($name);
    }
}

class test extends myActiveRecords
{

    public function getParty()
    {
        return $this->party;
    }
}

$test = new test();
echo $test->party;

我希望如果Yii调用$ test->派对,它不只是查找属性,而是首先通过我的getFunction(),即使我的getFunction只返回属性。 (在Yii中,属性永远不会被定义为属性,但总是通过__get()

当我打电话给$ test-> getParty()时,它就像一个魅力,但是当Yii做这个$ test->派对时,它不会发生以下情况:

$ this-> party调用magic __get(),它调用函数getParty()。但是当函数getParty再次执行$ this-> party时,魔术函数不再被调用,但是我得到了一个未定义的属性错误。 我有办法,但我不想使用它,这就是这个功能:

function getParty()
{
    return self::__get('party');
}

我开始这样工作的原因是因为我喜欢获取和设置方法,当我看到这样使用的公共属性时,我感到很沮丧,而且因为我坚持使用不是用英语写的遗留代码所以经常这样做,就像魅力一样,只是在两次调用相同名称的魔术函数时才会这样做:

public function getParty()
{
    return $this->feest;
}

有谁知道原因?或者我错了吗?

2 个答案:

答案 0 :(得分:1)

如果你想覆盖魔法__get(),你应该在你的子类中这样做:

class test extends myActiveRecords
{
    //overrides myActiveRecords' __get()
    public function __get($name)
    {
        if ($name == 'party') return $this->$name;
        else return parent::__get($name);
    }
}

根据您发布的代码查看代码,我认为解释了差异:http://pastebin.com/cxh9HMah

答案 1 :(得分:0)

原因是这可能导致对__get()方法的无限调用。是的,你可能会提出一些可以阻止它的逻辑。但是php选择不允许开发人员自己开枪。出于这个原因,一旦进入__get()方法,就不会再次调用它。