2011-09-19 11 views
12

muszę klasę nadrzędną, aby uzyskać dostęp do jego właściwości podrzędne:Dostęp nieruchomość dziecko z zakresu dominującej

class Parent { 
    private $_fields = null; 

    public function do_something() { 
    // Access $_fields and $child_var here 
    } 
} 

class Child extends Parent { 
    private $child_var = 'hello'; 
} 

$child = new Child(); 
$child->do_something(); 

Kiedy $_fields jest modyfikowana z zakresu dziecięcej, to jeszcze null w zakresie dominującej. Podczas próby uzyskania dostępu $ child_var z zakresu nadrzędnego przy użyciu $this->child_var, jest to oczywiście niezdefiniowane.

nie znalazłem czegoś podobnego „zestaw funkcji, które po prostu” być kopiowane w klasie dziecko ...

+4

Prawdopodobnie chcesz, aby właściwości 'protected' zamiast' private'. –

Odpowiedz

9

Spójrz na artykuł o visibility.

Zasadniczo nie można uzyskać dostępu do właściwości/metod rodzica private, a rodzic nie może uzyskać dostępu do jego obiektów. Możesz jednak zadeklarować swoją własność/metodę protected.

+0

Dziękujemy! Właśnie tego szukałem. Wydaje się, że nie przeczytałem tej dokumentacji wystarczająco. –

6

Próba uzyskania dostępu do wartości podrzędnych z klasy podstawowej (rodzica) jest złym projektem. Co się stanie, jeśli w przyszłości ktoś utworzy kolejną klasę na podstawie klasy nadrzędnej, zapomnij utworzyć tę właściwość, do której chcesz uzyskać dostęp w klasie nadrzędnej?

Jeśli trzeba zrobić coś takiego, że należy utworzyć właściwość w klasie macierzystej, a następnie ustawić go w dziecko:

class Parent 
{ 
    protected $child_var; 

    private $_fields = null;  
    public function do_something() 
    {  
     // Access $_fields and $child_var here 
     //access it as $this->child_var 
    } 
} 
class Child extends Parent 
{ 
    $child_var = 'hello'; 
} 

$child = new Child(); 
$child->do_something(); 

Zasadniczo w rodzic nie powinien referencyjna zawartość dziecko specyficzne, bo nie może być pewny, że tam będzie!

Jeśli trzeba, należy użyć abstrakcję:

PHP Abstraction

+0

Cóż, wiem, że to zła praktyka, ale jest to bardzo konkretny przypadek, który naprawdę tego wymaga. Dziękuję za odpowiedź. –

+0

Rozumiem problem, ale to rozwiązanie wciąż mnie oczekuje. Jak możemy egzekwować klasę podrzędną, aby zdefiniować określoną właściwość? Mam konkretną funkcję w abstrakcyjnej klasie nadrzędnej, która wymaga pewnej własności. W tej chwili używam $ this-> childProperty w klasie nadrzędnej i działa, ale ten sam problem, który zaznaczyłeś. –

+0

Możesz uczynić abstrakcję '$ child_var'. zmusiłoby to dzieci do faktycznego wprowadzenia go w życie. –

Powiązane problemy