可能重复:
为什么即使类和构造函数的情况不同,我的构造函数仍然被调用?
<?php
abstract class foo {
function foof() {
echo "Hello, I'm foo :)";
}
}
class foo2 extends foo {
function foo2f() {
$this->foof();
}
}
class foo3 extends foo2 {
function foo3f() {
$this->foo2f();
}
}
$x = new foo3;
$x->foo3f();
?>
这段代码输出"Hello,I’m foo:("(正如预期的那样(,但当我将代码更改为这样的内容时:http://pastebin.com/wNeyikpq
<?php
abstract class foo {
function fooing() {
echo "Hello, I'm foo :)";
}
}
class foo2 extends foo {
function foo2() {
$this->fooing();
}
}
class foo3 extends foo2 {
function foo3() {
$this->foo2();
}
}
$x = new foo3;
$x->foo3();
?>
PHP打印:
你好,我是foo
为什么?是虫子吗?
因为您要调用foo2两次,所以foo2
中的function foo2()
是一个构造函数。
正确的答案不是foo2
中的function foo2()
是构造函数,尽管它确实是构造函数。
答案是foo3()
是在new foo3()
中调用的构造函数。此构造函数调用方法foo2()
。
实际上foo2
更新的构造函数被调用,因为foo3
没有对其父构造函数的调用。
因为您要调用foo3()
两次,所以foo3
中的function foo3()
是一个构造函数Docs:
为了向后兼容性,如果PHP 5找不到给定类的__construct((函数,它将根据类的名称搜索旧样式的构造函数。
第一次呼叫:
$x = new foo3;
第二次通话:
$x->foo3f();
给foo3
一个真正的构造函数,你就可以了:
class foo3 extends foo2 {
function __construct() {};
function foo3() {
$this->foo2();
}
}