私が抱えている問題の簡単なデモンストレーションを作成しました。これは私がそれを実装している方法とは正確には異なりますが、同じ結果につながるようです。
<?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は同じ出力を提供します。代わりに、まあ、それは上記を行うことになります...直接設定された3つの文字列のうちの2つで埋め、最初の3つの最初に設定された文字列を保持します。
おそらく、単なるばかげた間違いか、オーバーロード関数の誤解です。いずれにせよ、私はここで長い間立ち往生しているので、助けていただければ幸いです。