如果类有一个带有他的名字的方法(函数),为啥要调用构造函数?

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 的构造函数。由于DB 的子代并且D 没有引入自己的构造函数,所以B 的构造函数将被调用,从而触发输出中的B

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

【讨论】:

类 classB 扩展 A public function b() echo "B";将 B 类更改为喜欢上层代码后。那为什么它会回显“AD”? 我不明白你。你能详细说明一下吗? @hek2mgl,他的意思是,他将构造函数名称从b()更改为B(),现在输出为AD 无法重现。 是的,因为B 扩展了AA 定义了一个方法a() .. 这不是很明显吗?【参考方案2】:

当您调用$d = new D(); 时,会调用B 构造函数(因为D 继承自CC 继承自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 版本。

【讨论】:

以上是关于如果类有一个带有他的名字的方法(函数),为啥要调用构造函数?的主要内容,如果未能解决你的问题,请参考以下文章

为啥将函数作为函数的参数传递?

子类为啥要调用父类的构造函数

54)纯虚函数和抽象类

c#里为啥有的使用时函数需要new一个对象而有的不用?为啥不直接调用就好?

java 为什么有时一个类有多个构造函数

java构造函数