我知道這是一個奇怪的設置,但我試圖避免一些神奇的Yii非常喜歡。__get不能爲某個名字工作兩次
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的調用$測試 - >黨不只是看的屬性,但首先通過我的getFunction(),即使我的getFunction剛剛返回屬性。在Yii中,屬性永遠不會被定義爲一個屬性,但總是通過__get()來處理。但是當Yii執行這個$ test-> party時不會發生以下情況:
$ this-> party calls magic __get(),它調用函數getParty()。但是,當函數getParty再次執行$ this-> party時,魔術函數不會被稱爲。第二次,但我得到一個未定義的屬性錯誤 我有一個辦法解決,但我不喜歡使用它,這就是這個函數:
function getParty()
{
return self::__get('party');
}
我開始這樣工作的原因是因爲我喜歡獲取和設置方法,當我看到像這樣的公共屬性時,我會感到不適,同時也因爲我遺留的遺留代碼不是用英語寫的,所以我經常這樣做這個工作就像一個魅力,而不是當同一個名字的魔法功能被稱爲兩次時:
public function getParty()
{
return $this->feest;
}
有沒有人知道原因?還是我錯了?
在這裏,我認爲PHP是在腳下射擊自己。 但是,謝謝你確認這是它應該按照PHP工作的方式。我會堅持我以前的「解決方案」,並明確地調用__get方法。 – tmas 2014-10-01 11:43:33