PHP 5 允行开发者在一个类中定义一个方法作为构造函数。具有构造函数的类会在每次创建新对象时先调用此方法,所以非常适合在使用对象之前做一些初始化工作。
如果子类中定义了构造函数则不会隐式调用其父类的构造函数。要执行父类的构造函数,需要在子类的构造函数中调用 parent::__construct()。如果子类没有定义构造函数则会如同一个普通的类方法一样从父类继承(假如没有被定义为 private 的话)。
事例1:父类构造函数无参数
<?php
class A {
public $value = 'A';
public function __construct() {
echo 'A construct';
}
}
class B extends A {}
$B = new B();
运行结果:A construct
事例2
<?php
class A {
public $value = 'A';
public function __construct($value) {
$this->value = $value;
echo $this->value;
}
}
class B extends A { }
$B = new B('B');
运行结果:B
事例3
<?php
class A {
public $value = 'A';
public function __construct($value) {
$this->value = $value;
echo $this->value;
}
}
class B extends A { //B类中也定义了自己的构造函数
public function __construct() {
echo 'B construct';
}
}
$B = new B();
运行结果:B construct
由上述三个事例可以看出,在子类进行实例化对象时,如果父类有构造函数,而子类无构造函数,则自动执行构造函数;若父类有构造函数,而子类也有构造函数,则会执行子类的构造函数。
那么,如果想要在子类有构造函数,父类也有构造函数时,两者都执行,该如何操作呢?请看事例5:
事例5
<?php
class A {
public function __construct() {
echo 'A construct';
}
}
class B extends A {
public function __construct() {
//这里就要加上parent::__construct()或者A::__construct()来主动调用父类的构造函数
parent::__construct();
echo 'B construct';
}
}
$B = new B();
运行结果:A constructB construct
定义构造函数难道只能用__construct吗?大家肯定知道,还有就是可以使用和类名同名的命名方式来定义构造函数:
事例6
<?php
class A {
public function A() {
echo 'A construct';
}
}
class B extends A {
public function B() {
//这里调用时,也可以使用A::__construct()或者A::A()来进行调用
A::__construct();
echo 'B construct';
}
}
$B = new B();
运行结果:A constructB construct
这里还要情调的一点是,Php中,函数名是不区分大小写的,但是变量属性名是区分大小写的,大家不妨可以试一试,印象更深刻。
1059





