• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

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

php 搞代码 3年前 (2022-01-25) 12次浏览 已收录 0个评论
文章目录[隐藏]

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

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

<code><?php//namespace test;class abc {    public function abc() {        echo 111;    }}$aa = new abc;//$aa -> abc();?></code>

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

如上面代码,注释了命名空间后,实例化之后直接输出 111。但是加上命名空/本文来源gao@!dai!ma.com搞$$代^@码5网@搞代gaodaima码间后又需要手动调用了!

回复内容:

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

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

<code><?php//namespace test;class abc {    public function abc() {        echo 111;    }}$aa = new abc;//$aa -> abc();?></code>

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

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

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

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

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

第二个问题

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

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

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

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

其次:

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

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

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


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:实例化 – 关于php 实例一个类的一点问题

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址