2011-09-13 12 views
5

Chciałbym, aby moja abstrakcyjna klasa nadrzędna posiadała metodę, która byłaby dziedziczona przez podklasę, która pozwoliłaby tej podklasie na iterację wszystkich jej zmiennych (zarówno zmiennych dziedziczonych z rodzic i jego własne zmienne).Funkcja macierzysta PHP nie jest w stanie zobaczyć elementów podklasy

W tej chwili gdybym wdrożenia tej metody w nadrzędnej, to tylko zmienne jednostki dominującej będzie powtórzyć w ciągu:

class MyObject { 

    private $one; 
    private $two; 
    private $three; 

    function assignToMembers() { 
     $xx = 1; 
     foreach($this as $key => $value) { 
      echo "key: ".$key."<br />"; 
      $this->$key = $xx; 
      $xx++; 
     } 
    } 

    public function getOne() { 
     return $this->one; 
    } 

    public function getTwo() { 
     return $this->two; 
    } 

    public function getThree() { 
     return $this->three; 
    } 
} 


class MyObjectSubclass extends MyObject { 

    private $four; 
    private $five; 

    public function getFour() { 
     return $this->four; 
    } 

    public function getFive() { 
     return $this->five; 
    } 
} 
$o = new MyObjectSubclass(); 
$o->assignToMembers(); 
echo $o->getOne()." "; 
echo $o->getTwo()." "; 
echo $o->getThree()." "; 
echo $o->getFour()." "; 
echo $o->getFive()." "; 

// This prints 1 2 3 

Z drugiej strony, jeśli kładę assignToMembers funkcja w podklasie, a następnie tylko członkowie podklasy są iterowane.

Ponieważ chcę, aby moja funkcja assignToMembers() była użyteczna dla wielu podklas, nie chcę jej implementować w każdym, tylko w klasie nadrzędnej, ale wygląda na to, że będę musiał, chyba że może dostęp do członków tej klasy.

Czy istnieje sposób, aby to osiągnąć?

Z góry dziękuję.

Odpowiedz

5

Musisz użyć protected, jeśli chcesz, aby kod działał zgodnie z opisem. Pamiętaj roli modyfikatorów dostępu/Widoczność:

  • private - poziom klasa tylko dostęp
  • protected - cały łańcuch dziedziczenia dostęp
  • public - powszechny dostęp
+0

Dziękuję bardzo. – Joe

3

Spróbuj zmienić swoje „prywatne” definicje do tych „chronionych”.

PHP Visibility:

Widoczność

Widoczność właściwości lub metody mogą być zdefiniowane przez poprzedzenie deklaracji z kluczowych publiczne, chronione lub prywatnych. Dostęp do publicznie zadeklarowanych członków klasy można uzyskać wszędzie. Użytkownicy deklarowani jako chronieni są dostępni tylko w obrębie samej klasy i przez klasy odziedziczone i nadrzędne . Członkowie zadeklarowani jako prywatni mogą uzyskać tylko dostęp przez klasę, która definiuje członka.

+0

Nie zdawałem sobie sprawy, że widoczność działa w obie strony. – Joe

Powiązane problemy