PHP - расширенная __construct - PullRequest
       18

PHP - расширенная __construct

29 голосов
/ 13 августа 2010

Мне было интересно, не могли бы вы помочь мне ...

У меня есть два класса, один расширяет другой. Класс B будет расширяться различными объектами и использоваться для общих взаимодействий с базой данных. Теперь яхотел бы, чтобы класс B обрабатывал свое соединение и отключался без направления от класса A или любого внешнего входа.

Проблема, насколько я понимаю, состоит в том, что расширенный класс не будет автоматически запускать свою функцию __construct.способ обойти это?

Заранее спасибо ..

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

Ответы [ 3 ]

77 голосов
/ 13 августа 2010

Родительский метод __construct(), определенный в классе b, будет запускаться автоматически, если вы создадите экземпляр дочернего класса a, , если не существует метод __construct(), определенный в классе a.

class a extends b { 
} 

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

$x = new a();

Если в классе a определен метод __construct(), то он отменяет использование метода __construct() в классе b .... он будет запускать вместо метод класса 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();

Таким образом, если в вашем дочернем классе определен метод __construct(), вам необходимо явно вызвать конструктор для родителя, если вы хотите выполнить его также.

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();
10 голосов
/ 13 августа 2010

Я не уверен, что полностью понимаю, что вы спрашиваете, но вы можете вызвать метод конструирования родителей из конструктора ребенка

parent::__construct();

Это единственный известный мне вариант.

4 голосов
/ 13 августа 2010

Позвоните parent::__construct() in a::__construct():

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

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

Вы можете вообще не указывать конструктор a, если вы не делаете никаких специфических вещей.

...