php防止一个类实例化,实例化-关于php实例一个类的一点问题

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

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

abc();

?>

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

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

回复内容:

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

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

abc();

?>

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

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

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

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

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

第二个问题

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

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

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

你的问题在php 的构造函数中又详细说明, 这里我就引用一下:

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

其次:

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

官方明确说明。

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

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

本条技术文章来源于互联网,如果无意侵犯您的权益请点击此处反馈版权投诉

本文系统来源:php中文网

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值