可能重复:
Why is my constructor still called even if the class and constructor case are different?
<?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 :)你好,我很好!)
为什么呢?这是一个错误吗?
答案 0 :(得分:8)
因为您正在调用foo2两次function foo2()
foo2
,所以它是构造函数。
答案 1 :(得分:4)
正确的答案不是function foo2()
中的foo2
它是构造函数,尽管它是构造函数。
答案是foo3()
是new foo3()
中调用的构造函数。此构造函数调用方法foo2()
。
实际上调用了foo2
newer的构造函数,因为foo3
没有调用他的父构造函数。
因为您要拨打foo3()
两次,function foo3()
中的foo3
是constructor Docs:
为了向后兼容,如果PHP 5找不到给定类的__construct()函数,它将按类的名称搜索旧式构造函数。
第一个电话:
$x = new foo3;
第二个电话:
$x->foo3f();
给foo3
一个真正的构造函数,你很好:
class foo3 extends foo2 {
function __construct() {};
function foo3() {
$this->foo2();
}
}