2010-02-17 18 views
12

patrz poniższy przykład (PHP)Dostęp klasa nadrzędna własność z dzieckiem

class Parent 
{ 
    protected $_property; 
    protected $_anotherP; 

    public function __construct($var) 
    { 
    $this->_property = $var; 
    $this->someMethod(); #Sets $_anotherP 
    } 

    protected function someMethod() 
    ... 
} 

class Child extends Parent 
{ 
    protected $parent; 

    public function __construct($parent) 
    { 
    $this->parent = $parent; 
    } 

    private function myMethod() 
    { 
    return $this->parent->_anotherP; #Note this line 
    } 
} 

Jestem nowy OOP i jestem trochę ignorantem.

Tutaj, aby uzyskać dostęp do właściwości rodziców, używam instancji tej klasy, która wydaje się błędna: S (nie trzeba wtedy być dzieckiem). Czy istnieje prosty sposób, aby zsynchronizować właściwości nadrzędne z właściwościami podrzędnymi i uzyskać bezpośredni dostęp do $ this-> anotherP bez konieczności użycia $ this-> parent-> anotherP?

Odpowiedz

27

Jako klasa Child rozszerza swoją klasę Parent, co właściwości i metody, które są albo public lub protected w klasie Parent będzie postrzegana przez klasę Child jakby były zdefiniowane w klasie Child - i odwrotnie arround.

Gdy klasa Childextends klasa Parent, może to być postrzegane jako Child jest Parent - co oznacza, że ​​Child ma właściwości Parent, chyba że na nowo definiuje te inny sposób.

(BTW, trzeba pamiętać, że „parent” jest zarezerwowanym słów kluczowych, w PHP - co oznacza, że ​​nie można wymienić klasę o tej nazwie)


Oto krótki przykład „rodzica "Klasa:

class MyParent { 
    protected $data; 
    public function __construct() { 
     $this->someMethodInTheParentClass(); 
    } 
    protected function someMethodInTheParentClass() { 
     $this->data = 123456; 
    } 
} 

I to "dziecko" klasa:

class Child extends MyParent { 
    public function __construct() { 
     parent::__construct(); 
    } 
    public function getData() { 
     return $this->data; // will return the $data property 
          // that's defined in the MyParent class 
    } 
} 

Th co może być wykorzystane w ten sposób:

$a = new Child(); 
var_dump($a->getData()); 

a dostaniesz jako wyjście:

int 123456 

Co oznacza właściwość $data, zdefiniowaną w klasie MyParent i zainicjowany w metodzie tej samej MyParent klasa, jest dostępna przez klasę Child, tak jakby była własna.


Żeby było proste: jak Child "jest" MyParent, nie trzeba zachować wskaźnik do ... sama ;-)

+1

tak. Wywołanie konstruktora parent :: __ było tym, czego potrzebowałem: O – shxfee

+0

Och, tak, to jedna z trudnych rzeczy i nie myślałem o tym: jeśli twoja klasa potomna definiuje konstruktor, PHP nie wywoła konstruktora klasy nadrzędnej - co oznacza, że ​​będziesz musiał zadzwonić sam * (patrz uwaga na http://fr.php.net/manual/en/language.oop5.decon.php) * –

-2

to powinno działać ..

class Child extends Parent 
{ 
    private function myMethod() 
    { 
    return $this->_anotherP; 
    } 
} 

ponieważ _anotherP jest chroniony, więc każda klasa pochodna może uzyskać do niego dostęp, ale nie jest w innym obiekcie, jest tym samym obiektem.

Jednak sprawiają, że pobierający setery w rodzicach to mądry wybór.

0

To może zaoszczędzić ci kilkugodzinnych poszukiwań.

Pamiętaj: Twoja klasa Child dziedziczy tylko właściwości ZDEFINIOWANE w klasie nadrzędnej ...Więc jeśli utworzysz obiekt przy użyciu Parent, a następnie zapełnisz danymi, to te dane NIE będą dostępne w twojej klasie dziecka ...

To oczywiście bardzo oczywiste, ale domyślam się, że inni mogą napotkać ten sam problem.

Bardzo proste rozwiązanie nie polega na rozszerzaniu czegokolwiek, wystarczy przekazać obiekt $ swojej klasy macierzystej do klasy potomnej za pośrednictwem konstruktora. W ten sposób masz dostęp do wszystkich właściwości i metod obiektu generowanych przez klasę dominującą

Przykład

class child { 

    public parentObject; 

    public function __construct($parentObject) { 
     $this->parentObject = $parentObject; 
    } 

} 

Jeśli $ parentObject ma własności publicznej $ name, a następnie można uzyskać do niego dostęp wewnątrz dziecka klasa z funkcją podobną do:

public function print_name() { 
    echo $this->parentObject->name; 
} 
Powiązane problemy