如果 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
继承自 C
而 C
继承自 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
如果方法的名称与 class 相同,则它用作构造函数。这是为了向后兼容旧的 PHP 版本。
发生了一个丑陋的副作用。在 PHP 的旧版本中,class 的构造函数必须与 class 本身同名。 名称不区分大小写。在您的情况下,意思是 b
是 B
的构造函数。由于 D
是 B
的子代并且 D
没有引入自己的构造函数,因此 B
的构造函数将被调用,这会触发输出中的 B
。
在 PHP 的现代版本中,应调用构造函数 __construct()
以避免此类问题。但是,您仍然可以使用旧机制,但如果您的错误报告级别设置为 E_STRICT
.
,它会触发通知
为什么这段代码会回显 '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
继承自 C
而 C
继承自 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
如果方法的名称与 class 相同,则它用作构造函数。这是为了向后兼容旧的 PHP 版本。
发生了一个丑陋的副作用。在 PHP 的旧版本中,class 的构造函数必须与 class 本身同名。 名称不区分大小写。在您的情况下,意思是 b
是 B
的构造函数。由于 D
是 B
的子代并且 D
没有引入自己的构造函数,因此 B
的构造函数将被调用,这会触发输出中的 B
。
在 PHP 的现代版本中,应调用构造函数 __construct()
以避免此类问题。但是,您仍然可以使用旧机制,但如果您的错误报告级别设置为 E_STRICT
.