我知道这是一个奇怪的设置,但我试图避免一些神奇的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;
}
有谁知道原因?或者我错了吗?
答案 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()
方法,就不会再次调用它。