2010-08-13 12 views
20

mi era wonderinf se poteste aiutarmi ..PHP - __construct esteso

Ho due classi, uno si estende l'altro .. Classe B sarà esteso da vari oggetti diversi e utilizzati per le interazioni di database comuni .. Ora vorrei che la classe B gestisse la sua connessione e disconnettesse senza direzione dalla classe A o qualsiasi input esterno.

Il problema da quello che ho capito è che una classe estesa non eseguirà automaticamente la sua funzione __costruct .. Esiste un modo per aggirare questo?

Grazie in anticipo ..

class a extends b 
{ 
    public function __construct() 
    { 
    } 

    public function validateStuff() 
    { 
     $this->insert_record(); 
    } 
} 

class b 
{ 
    public function __construct() 
    { 
     $this->connect(); 
    } 

    protected function connect() 
    { 
     return true; 
    } 

    public function insert_record() 
    { 
     return true; 
    } 
} 

risposta

55

Il genitore __construct() metodo definito nella classe B verrà eseguito automaticamente se si crea un'istanza di classe figlia di una, a meno che non c'è un metodo __construct() definito in classe a.

class a extends b { 
} 

class b { 
    public function __construct() 
    { 
     echo 'In B Constructor'; 
    } 
} 

$x = new a(); 

Se un metodo __construct() è definito in classe A, allora questo sostituisce l'uso del metodo __construct() in classe b .... verrà eseguito invece di classe b __construct() metodo

class a extends b { 
    public function __construct() 
    { 
     echo 'In A Constructor'; 
    } 
} 

class b { 
    public function __construct() 
    { 
     echo 'In B Constructor'; 
    } 
} 

$x = new a(); 

Quindi, se la classe figlio ha un metodo __construct() definito, è necessario chiamare esplicitamente il costruttore per il genitore se si desidera eseguire anche quello.

class a extends b { 
    public function __construct() 
    { 
     parent::__construct(); 
     echo 'In A Constructor'; 
    } 
} 

class b { 
    public function __construct() 
    { 
     echo 'In B Constructor'; 
    } 
} 

$x = new a(); 
+3

Grazie :) - StackOverflow è così bravo nell'avere e trovare informazioni rilevanti che puoi indulgere in questi flussi di lavoro come "mi piace, lo so, ma voglio solo assicurarmi che non mi stia imbattendo in una piccola intuizione di PHP da qualche parte" - grazie haha! – lol

10

Non sono sicuro Capisco perfettamente quello che chiedete, ma è possibile chiamare i genitori costruire metodo dal costruttore del bambino

parent::__construct(); 

Questo è il unica opzione che conosco.

+0

Non volevo chiamare il costruttore affatto dalla classe a. Speravo di trovare un metodo per applicare il costruttore della classe b per l'esecuzione automatica. – Lee

3

chiamata parent::__construct() in a::__construct():

class a extends b 
{ 
    public function __construct() 
    { 
     parent::__construct(); 
    } 

    public function validateStuff() 
    { 
     $this->insert_record(); 
    } 
} 

è possibile omettere di un costruttore del tutto, se non stai facendo qualsiasi materiale a-specifica.

+0

Non volevo chiamare affatto il costruttore dalla classe a. Speravo di trovare un metodo per applicare il costruttore della classe b per l'esecuzione automatica .. – Lee

+0

Ah questa era la risposta .. lasciando il costruttore fuori dalla classe A , la classe B è corsa! Grazie! – Lee

Problemi correlati