PHP - __construct esteso
-
28-09-2019 - |
Domanda
Mi chiedevo se potesse dare una mano ..
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 classe B per gestire i suoi disconnette connessione e senza direzione dalla classe A o qualsiasi ingresso esterno ..
Il problema da quanto ho capito è che una classe estesa non verrà eseguita automaticamente la sua funzione __construct .. C'è 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;
}
}
Soluzione
Il metodo genitore __construct()
definito nella Classe B verrà eseguito automaticamente se si crea un'istanza di classe figlia di una, a meno che v'è 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 override l'uso del metodo __construct()
in classe b .... verrà eseguito anziché il metodo della classe b __construct()
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 bambino ha un metodo __construct()
definito, allora avete bisogno di 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();
Altri suggerimenti
Non sono sicuro che comprendere appieno quello che chiedete, ma è possibile chiamare il metodo genitori costrutto dal costruttore del bambino
parent::__construct();
Questa è l'unica opzione che conosco.
Chiamata parent::__construct()
in a::__construct()
:
class a extends b
{
public function __construct()
{
parent::__construct();
}
public function validateStuff()
{
$this->insert_record();
}
}
È possibile omettere un costruttore di tutto se non stai facendo qualsiasi materiale a-specifica.