Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/226.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php __get不';我不会为了某个名字工作两次_Php_Yii_Magic Methods - Fatal编程技术网

Php __get不';我不会为了某个名字工作两次

Php __get不';我不会为了某个名字工作两次,php,yii,magic-methods,Php,Yii,Magic Methods,我知道这是一个奇怪的设置,但我正试图避免一些我非常喜欢的魔法 class myActiveRecord extends CActiveRecord { public function __get($name) { $method = 'get' . ucfirst($name); if(method_exists($this, $method)) { $backtrace = debug_backtrace(DEBUG_BACKTR

我知道这是一个奇怪的设置,但我正试图避免一些我非常喜欢的魔法

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->party,它不只是查找属性,而是首先遍历我的getFunction(),即使我的getFunction只是返回属性。 (在Yii中,属性从未定义为属性,而是始终通过_get()

当我调用$test->getParty()时,它就像一个符咒一样工作,但是当Yii执行$test->party时,它不会执行,以下情况会发生:

$this->party调用magic\uu get(),该函数调用函数getParty()。但是当函数getParty再次调用$this->party时,不会再次调用magic函数,但我得到一个未定义的属性错误。 我有办法,但我不想使用它,这就是这个功能:

function getParty()
{
    return self::__get('party');
}
我之所以开始这样工作,是因为我喜欢get和set方法,当我看到像这样使用公共属性时,我会不寒而栗,也因为我一直在使用非英语编写的遗留代码,所以我经常这样做,这确实很有魅力,只是当相同名称的神奇函数被调用两次时,情况就不同了:

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

有人知道原因吗?还是我错了?

如果你想覆盖magic
\uu get()
,你应该在你的子类中这样做:

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

查看基于您发布的代码的代码,我认为这可以解释差异:

原因是这可能会导致无限次调用
\uuuu get()
方法。是的,您可能会加入一些逻辑来阻止它。但是php选择不允许开发人员攻击自己的脚。出于这个原因,一旦进入
\uu get()
method,不再调用它。

重点是不必为每个单独的参数都这样做,那么我更喜欢我的“解决方案”。在这里,我认为PHP就是要打击你自己。但是感谢你确认这是它根据PHP应该工作的方式。我将坚持我以前的“解决方案”并显式调用uu get方法。