PHP — расширенная __конструкция

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

У меня есть два класса, один расширяет другой. Класс 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;
   }
}

person Lee    schedule 13.08.2010    source источник


Ответы (3)


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

class a extends b { 
} 

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

$x = new a();

Если метод __construct() определен в классе a, то это переопределяет использование метода __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();
person Mark Baker    schedule 13.08.2010
comment
Спасибо :) - stackoverflow так хорош в том, чтобы иметь и находить соответствующую информацию, которую вы можете использовать в таких рабочих процессах, я знаю это, но я просто хочу убедиться, что я не сталкиваюсь где-то с небольшой интуицией PHP - спасибо, ха-ха! - person lol; 07.05.2013

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

parent::__construct();

Это единственный вариант, который я знаю.

person GWW    schedule 13.08.2010
comment
Я вообще не хотел вызывать конструктор из класса a. Я надеялся найти метод для автоматического запуска конструктора класса b. - person Lee; 13.08.2010

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

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

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

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

person Annika Backstrom    schedule 13.08.2010
comment
Я вообще не хотел вызывать конструктор из класса a. Я надеялся найти метод для автоматического запуска конструктора класса b. - person Lee; 13.08.2010
comment
Ааа, это был ответ... оставив конструктор вне класса A, класс B побежал! Спасибо! - person Lee; 13.08.2010