如果 class 有一个以他的名字命名的方法(函数),为什么要调用构造函数?

Why the constructor is called if the class have a method (function) with his name?

为什么这段代码会回显 'BD'?得到之后我很惊讶。我正在学习 OOP 概念,并且是高级新手 php。

class A {
    public function a(){
        echo "A";
    }
}
class B extends A {
    public function b(){
        echo "B";
    }
}
class C extends B {
    public function a(){
        echo "C";
    }
}
class D extends C {
    public function a(){
        echo "D";
    }
}

$d = new D();
$d->a();

当您调用 $d = new D(); 时,会调用 B 构造函数(因为 D 继承自 CC 继承自 B)当你调用 $d->a(); 时,你的 class D 的方法 a() 被调用并打印 D 然后你有输出 BD.

为了向后兼容,如果 PHP 5 找不到给定 class 的 __construct() 函数,并且 class 没有从父 class, 它将搜索旧式构造函数,名称为 class。实际上,这意味着唯一会出现兼容性问题的情况是 class 有一个名为 __construct() 的方法,该方法用于不同的语义。

在你的例子中,你的 class A 和你的 class B 有一个构造函数

阅读模式位于:

http://php.net/manual/en/language.oop5.decon.php

http://php.net/manual/en/language.oop5.decon.php

如果方法的名称与 class 相同,则它用作构造函数。这是为了向后兼容旧的 PHP 版本。

发生了一个丑陋的副作用。在 PHP 的旧版本中,class 的构造函数必须与 class 本身同名。 名称不区分大小写。在您的情况下,意思是 bB 的构造函数。由于 DB 的子代并且 D 没有引入自己的构造函数,因此 B 的构造函数将被调用,这会触发输出中的 B

在 PHP 的现代版本中,应调用构造函数 __construct() 以避免此类问题。但是,您仍然可以使用旧机制,但如果您的错误报告级别设置为 E_STRICT.

,它会触发通知