Я знаю, что это странная обстановка, но я пытаюсь избежать волшебства, которое так сильно любит 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-> party, он не просто ищет атрибут, но сначала проходит через мою функцию getFunction (), даже если моя функция getFunction просто возвращает атрибут.
(в Yii атрибуты никогда не определяются как свойства, но всегда проходят через __get ()
Когда я вызываю $ test-> getParty (), он работает как шарм, однако, когда Yii делает эту $ test-> party, это не так, происходит следующее:
$ this-> party вызывает magic __get (), которая вызывает функцию getParty (). Но затем, когда функция getParty снова выполняет $ this-> party, волшебная функция не вызывается второй раз, но я получаю неопределенную ошибку свойства.
У меня есть способ обойти, но я предпочитаю не использовать его, и вот эта функция:
function getParty()
{
return self::__get('party');
}
Причина, по которой я начинаю работать таким образом, заключается в том, что мне нравятся методы get и set, я начинаю дрожать, когда вижу, как используются общедоступные свойства, а также потому, что я застрял с устаревшим кодом, который не был написан на английском языке, поэтому я часто делаю это, который работает как талисман, только не тогда, когда магическая функция для одного и того же имени вызывается дважды:
public function getParty()
{
return $this->feest;
}
Кто-нибудь знает причину? или я просто не прав?
Причина в том, что это может привести к бесконечному призыву к __get()
метод. Да, вы могли бы вставить некоторую логику, которая помешает этому. Но php решает не позволять разработчикам стрелять себе в ногу. По этой причине, когда-то внутри __get()
метод, он не вызывается снова.
Если вы хотите преодолеть магию __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