关于php 实例一个类的一点问题

发布于 2022-09-02 00:41:37 字数 333 浏览 13 评论 0

小弟有一疑惑不解,望提点!不胜感激!

php实例化一个类,次类的类名和其中一个方法名相同,实例化后直接就运行了该方法,这是为什么?

<?php
//namespace test;

class abc {

    public function abc() {

        echo 111;
    }
}
$aa = new abc;
//$aa -> abc();

?>

但是加上命名空间后这种现象又没有了,这里面有什么道理么?

如上面代码,注释了命名空间后,实例化之后直接输出 111。但是加上命名空间后又需要手动调用了!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

蘸点软妹酱 2022-09-09 00:41:37

与类同名的方法相当于构造函数,就是function __construct(){},

为了实现向后兼容性,如果 PHP 5 在类中找不到 __construct() 函数并且也没有从父类继承一个的话,它就会尝试寻找旧式的构造函数,也就是和类同名的函数。因此唯一会产生兼容性问题的情况是:类中已有一个名为 __construct() 的方法却被用于其它用途时。

建议不要使用与类名相同的函数名

第二个问题

自 PHP 5.3.3 起,在命名空间中,与类名同名的方法不再作为构造函数。这一改变不影响不在命名空间中的类。

所以 注释了命名空间后,实例化之后直接输出 111。但是加上命名空间后又需要手动调用了!

文档都有讲,仔细看:http://php.net/manual/zh/language.oop5.decon.php

-黛色若梦 2022-09-09 00:41:37

你的问题在php 的构造函数中又详细说明, 这里我就引用一下:
首先, 在php5中, 标准的构造函数是__construct , 但在之前的php版本中, 其构造函数是与类同名的函数, 为了兼容老的php版本, 这个特性就被保留了下来, 也就解释了你的第一个问题: 类名和其中一个方法名相同的时候, 实例化类执行了同名方法

其次:

自 PHP 5.3.3 起,在命名空间中,与类名同名的方法不再作为构造函数。这一改变不影响不在命名空间中的类。
官方明确说明。

PS: 有问题时最好首选看看官方文档, 很多时候这种问题你可以通过这个官方文档自己解决的

简单气质女生网名 2022-09-09 00:41:37

简单来说就是一个兼容问题,旧版的php构造函数跟类名相同,旧版应该是php4吧,5中引入了construct函数作为构造函数,为了兼容,当类中找不到construct函数且也没有继承父类的构造函数,就会把跟类同名的函数作为构造函数执行,但是这个规则在命名空间中会失效,猜测可能是命名空间也是新东西,所以不用考虑兼容吧。手机打字不好打下划线,construct前面有两个下划线

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文