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;
   }
}
È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top