0
我已經創建了我遇到的問題的簡短演示。這不完全是我如何實現它,但似乎導致相同的結果。使用__get,__set和__unset的類中的意外數組內容
<?php
class mainclass {
var $vardata = array();
function &__get ($var) {
if ($this->vardata[$var]) return $this->vardata[$var];
if ($var == 'foo') return $this->_loadFoo();
return NULL;
}
function __set ($var, $val) {
$this->vardata[$var] = $val;
}
function __unset($var) {
unset($this->vardata[$var]);
}
}
class extender extends mainclass {
function __construct() {
var_dump($this->foo);
$this->_loadFoo();
echo '<br>';
var_dump($this->foo);
}
function _loadFoo() {
unset($this->foo);
$this->foo = array();
$this->foo[] = 'apples';
$this->foo[] = 'oranges';
$this->foo[] = 'pears';
return $this->foo;
}
}
$test = new extender;
?>
上述代碼的輸出是:
array(3) { [0]=> string(6) "apples" [1]=> string(7) "oranges" [2]=> string(5) "pears" }
array(5) { [0]=> string(6) "apples" [1]=> string(7) "oranges" [2]=> string(5) "pears" [3]=> string(7) "oranges" [4]=> string(5) "pears" }
凡爲我所期待的:
array(3) { [0]=> string(6) "apples" [1]=> string(7) "oranges" [2]=> string(5) "pears" }
array(3) { [0]=> string(6) "apples" [1]=> string(7) "oranges" [2]=> string(5) "pears" }
的__get,__set和__unset功能都被稱爲在正確的地方所以我希望第二個,直接調用函數來簡單地取消設置$ this-> foo,並用相同的數據重新填充它。這意味着var_dumping它會給出相同的輸出。相反,它最終會完成上述操作......用三個字符串中的兩個直接設置並保留前三個原始字符串。
也許只是一個愚蠢的錯誤或對重載函數的誤解 - 無論哪種方式,我一直在這裏卡住了太久,所以任何幫助都非常感謝!
感謝。添加isset將它排序在我的實現中,在那裏進行一些監督。指出的其他問題是關於我發佈的示例代碼的相關觀點 - 感謝您花時間瀏覽它。 – JoeR 2010-06-23 15:41:21