2010-02-17 23 views
12

Vedere il seguente esempio (PHP)Accesso classe genitore proprietà dal bambino

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 
    } 
} 

Sono nuovo di programmazione orientata agli oggetti e sono un po 'ignorante.

Qui per accedere alla proprietà dei genitori Sto usando un'istanza di quella classe, che sembra sbagliata: S (non c'è bisogno di essere io bambino allora). C'è un modo semplice, in modo che io possa sincronizzare le proprietà genitore con le proprietà figlio e posso accedere direttamente a $ this-> anotherP senza dover usare $ this-> parent-> anotherP?

risposta

27

Poiché la classe Child sta estendendo la classe Parent, ogni proprietà e metodi che sono o public o protected nella classe Parent sarà visto dalla classe Child come se fossero definiti nella classe Child - e il contrario arround.

Quando la classe Childextends classe Parent, può essere visto come "Child è una Parent" - che significa che il Child ha le proprietà del Parent, a meno che ridefinisce quelli altro modo.

(a proposito, si noti che "parent" è una parola chiave riservata, in PHP - che significa che non si può nominare una classe con lo stesso nome)


Ecco un rapido esempio di un "genitore "classe:

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

Ed è "figlio" di classe:

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 in può essere utilizzato in questo modo:

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

E si otterrà come output:

int 123456 

Il che significa che la proprietà $data, definito nella classe MyParent, e inizializzato in un metodo di quello stesso MyParent classe, è accessibile dalla classe Child come se fosse proprio.


Per rendere le cose semplici: come il Child "è un" MyParent, non ha bisogno di mantenere un puntatore a ... sé ;-)

+1

sì. La chiamata al genitore :: __ costrutto era ciò di cui avevo bisogno: O – shxfee

+0

Oh, sì, questa è una delle cose complicate, e non pensavo di menzionarlo: se la classe del tuo bambino definisce un costruttore, PHP non chiamerà il costruttore della classe genitore - il che significa che dovrai chiamarlo tu stesso * (vedi la nota su http://fr.php.net/manual/en/language.oop5.decon.php) * –

-2

questo dovrebbe funzionare ..

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

perché _anotherP è protetto, quindi ogni classe derivata può accedervi, ma non è in un altro oggetto, è lo stesso oggetto.

Tuttavia rendere i getter un setter nel genitore è una scelta saggia.

0

Questo potrebbe farti risparmiare alcune ore di ricerca in giro.

Ricorda: la classe Figlio eredita solo le proprietà DEFINED nella classe Parent ...Quindi se istanziate un oggetto usando la classe Parent e poi lo compilate con i dati, allora questi dati NON saranno disponibili nella classe figlia ...

Ovviamente è ovvio, ma suppongo che altri possano imbattersi in stesso problema.

Una soluzione super semplice non è di estendere nulla, basta passare l'oggetto $ della classe genitore nella classe figlia tramite un costruttore. In questo modo si ha accesso a tutte le proprietà ei metodi dell'oggetto generate dalla classe padre

Esempio

class child { 

    public parentObject; 

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

} 

Se il $ ParentObject ha una proprietà pubblica nome $, allora è possibile accedere all'interno del bambino classe con una funzione del tipo:

public function print_name() { 
    echo $this->parentObject->name; 
} 
Problemi correlati