Kullanarak sınıfta beklenmedik dizi içeriği __, __ set olsun ve __ unset

0 Cevap php

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!

0 Cevap