Ben yaşıyorum sorunun kısa bir gösteri hazırladık. Bu onu uygulayan kulüpler nasıl tam değil ama aynı sonuca yol gibi görünüyor.
<?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;
?>
Yukarıdaki kod çıktısı:
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" }
Ben bekliyordum Nerede gibi:
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" }
__, __ Set olsun ve __ unset fonksiyonları tüm doğru yerlerde çağrıldığını ve bu yüzden fonksiyonun ikinci, doğrudan çağrı beklerdim basitçe unset $ this-> foo ve aynı veri ile tekrar doldurun. Bunu var_dumping aynı çıktıyı verecek anlamına gelir. Bunun yerine, iyi, doğrudan set üç dizeleri iki ile doldurma ve ilk üç orijinal olarak ayarlanan dizeleri tutmak ... Yukarıdaki yapıyor biter.
Sadece aptalca bir hata veya aşırı yüklenmelerin fonksiyonların bir yanlış anlama belki de - ya da böyle, ben şimdi çok uzun süre burada sıkışmış oldum ve böylece herhangi bir yardım çok takdir!