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方法。