Ответ 1
Это нормальный конструктор классов. Рассмотрим следующий пример:
class A {
protected $some_var;
function __construct() {
$this->some_var = 'value added in class A';
}
function echo_some_var() {
echo $this->some_var;
}
}
class B extends A {
function __construct() {
$this->some_var = 'value added in class B';
}
}
$a = new A;
$a->echo_some_var(); // will print out 'value added in class A'
$b = new B;
$b->echo_some_var(); // will print out 'value added in class B'
Как вы видите, класс B наследует все значения и функции от A. Таким образом, член класса $some_var
доступен как из A, так и из B. Поскольку мы добавили конструктор в класс B, конструктор класса A НЕ будет использоваться, когда вы создаете новый объект класса B.
Теперь рассмотрим следующие примеры:
class C extends A {
// empty
}
$c = new C;
$c->echo_some_var(); // will print out 'value added in class A'
Как вы можете видеть, поскольку мы не объявили конструктор, конструктор класса A используется неявно. Но мы также можем сделать следующее, что эквивалентно классу C:
class D extends A {
function __construct() {
parent::__construct();
}
}
$d = new D;
$d->echo_some_var(); // will print out 'value added in class A'
Таким образом, вам нужно использовать строку parent::__construct();
, если вы хотите, чтобы конструктор в дочернем классе что-то сделал, И выполните родительский конструктор. Пример:
class E extends A {
private $some_other_var;
function __construct() {
// first do something important
$this->some_other_var = 'some other value';
// then execute the parent constructor anyway
parent::__construct();
}
}
Более подробную информацию можно найти здесь: http://php.net/manual/en/language.oop5.php