在php中,如果A扩展了B,那么当实例化A时,B的_constrctor()会自动执行吗?或者我必须打电话给parent-> _constructor()?
答案 0 :(得分:8)
PHP查找它可以找到的最顶层(最接近实例化的类)__construct
方法。然后它只执行那个。
Class A {
public function __construct() {
echo "From A";
}
}
Class B extends A {
public function __construct() {
echo "From B";
}
}
Class C extends A {}
Class D extends B {}
Class E extends B {
public function __construct() {
echo "from E";
}
}
new A(); // From A
new B(); // From B
new C(); // From A
new D(); // From B
new E(); // From E
parent
访问列表中的下一个,直到没有更多(此时它会产生错误)...
因此,在类E
中,运行parent::__construct()
将执行类B
的构造函数。
在课程B
中,运行parent::__construct()
将执行类A
的构造函数。
在课程A
中,运行parent::__construct()
会产生错误,因为没有构造函数...
答案 1 :(得分:1)
答案是你必须打电话。
一个简单的测试:
class A {
public function __construct() {
echo 'A';
}
}
class B extends A {
public function __construct() {
echo 'B';
}
}
$ab = new B();
应该告诉你所有你需要知道的事情。
答案 2 :(得分:0)
如果A有一个,你需要从A的构造函数中调用“parent :: __ construct()”。否则你不需要。
答案 3 :(得分:0)
class A {
function __construct() {
echo 5;
}
}
class B_no_Constructor extends A {
}
class B_with_Constructor extends A {
function __construct(){}
}
//try one
//new B_no_Constructor; //outputs 5
//new B_with_Constructor; //outputs nothing