如果类有一个带有他的名字的方法(函数),为啥要调用构造函数?
Posted
技术标签:
【中文标题】如果类有一个带有他的名字的方法(函数),为啥要调用构造函数?【英文标题】:Why the constructor is called if the class have a method (function) with his name?如果类有一个带有他的名字的方法(函数),为什么要调用构造函数? 【发布时间】:2015-06-08 08:37:40 【问题描述】:为什么这段代码会回显“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();
【问题讨论】:
我不会依赖它,它将在 php7 中被弃用:弃用:与其类同名的方法将不会成为 PHP 未来版本中的构造函数; 类 classB 扩展 A public function b() echo "B";将 B 类更改为喜欢上层代码后。那为什么它会回显“AD”? 好吧,我明白你的意思了。现在我明白了。谢谢大家。 @MihirVadalia 如果答案可以帮助您至少检查一个是否已接受。如果您不知道如何操作,请阅读此***.com/tour 【参考方案1】:有一个丑陋的副作用正在发生。在以前的 PHP 版本中,类的构造函数必须与类本身同名。 名称不区分大小写。含义 b
在您的情况下是 B
的构造函数。由于D
是B
的子代并且D
没有引入自己的构造函数,所以B
的构造函数将被调用,从而触发输出中的B
。
在现代版本的 PHP 中,构造函数应该被称为 __construct()
以避免此类问题。但是,您仍然可以使用旧机制,但如果您的错误报告级别设置为E_STRICT
,它将触发通知。
【讨论】:
类 classB 扩展 A public function b() echo "B";将 B 类更改为喜欢上层代码后。那为什么它会回显“AD”? 我不明白你。你能详细说明一下吗? @hek2mgl,他的意思是,他将构造函数名称从b()
更改为B()
,现在输出为AD
无法重现。
是的,因为B
扩展了A
和A
定义了一个方法a()
.. 这不是很明显吗?【参考方案2】:
当您调用$d = new D();
时,会调用B
构造函数(因为D
继承自C
和C
继承自B
)并且当您调用$d->a();
时,您的方法a()
类D
被调用并打印D
然后你有作为输出BD
。
为了向后兼容,如果 PHP 5 找不到给定类的 __construct()
函数,并且该类没有从父类继承一个,它将搜索旧式构造函数,由类的名称。实际上,这意味着唯一会出现兼容性问题的情况是,如果该类有一个名为 __construct()
的方法,该方法用于不同的语义。
在您的情况下,您的 A 类和 B 类有一个构造函数
阅读模式在:
http://php.net/manual/en/language.oop5.decon.php
【讨论】:
但我还没有为 B 类声明构造函数。 @MihirVadalia 是的,你有一个构造函数 public function b() @MihirVadalia 你明白原因了吗?【参考方案3】:http://php.net/manual/en/language.oop5.decon.php
如果方法与类命名相同,则将其用作构造函数。这是为了向后兼容旧的 PHP 版本。
【讨论】:
以上是关于如果类有一个带有他的名字的方法(函数),为啥要调用构造函数?的主要内容,如果未能解决你的问题,请参考以下文章