为了账号安全,请及时绑定邮箱和手机立即绑定

PHP5的类实例变量的声明问题

PHP5的类实例变量的声明问题

慕莱坞森 2019-03-21 18:19:05
private $db = new Db();如上,在php5的类中,如果直接声明一个实例变量,就会报类声明错误改成下面这样就可以private $db = null;    public function __construct(){    $this->db = new Db();    }非得先声明一个空值,再用方法赋值,搞的常常写出来查半天发现没bug,才明白原来是语法要求。不明白是基于什么考虑,我理解,可能是php5学习面象对象学的还不完善,所以有很多问题,大伙聊聊。补问:PHP7还是这样吗?
查看完整描述

4 回答

?
慕哥9229398

TA贡献1877条经验 获得超6个赞

因为如果允许
private $db = new Db();
这样的语法,那么,文件被加载后,Db类就被初始化了。
请注意,是A类被载入内存,Db类就被实例化了。
而如果Db类也用了同样的语法,那么可能你include一个文件,就会很慢,因为include的同时,就在进行一系列的类实例化行为。

而禁用这种特性,只允许在类构造方法中实例化其他类,就能很好的控制类实例化的流程了。加载类时,永远不会产生附带的类实例化。

无论对于系统的优化,还是对于程序运行时间的掌控,可预测、可控的,才是好的、可持续的。


查看完整回答
反对 回复 2019-04-19
?
桃花长相依

TA贡献1860条经验 获得超8个赞

PHP暂时未提供对对象属性直接赋值对象的支持,对象的赋值暂时只能通过构造函数来实现。
当然,你不能说php要向java去学习面向对象,也没有谁规定java才是面向对象的标杆,如果php真的样样都和java一样了,那它干嘛还叫php呢。

补答:PHP7依然是这样。


查看完整回答
反对 回复 2019-04-19
?
慕虎7371278

TA贡献1802条经验 获得超4个赞

class的直接赋值只能是 标量 (数值,字符串,数组,布尔)


查看完整回答
反对 回复 2019-04-19
?
慕桂英546537

TA贡献1848条经验 获得超10个赞

都是大神 在函数外面直接实例化类没做过,但是你的第二种写法两个db不是同一个变量吧


查看完整回答
反对 回复 2019-04-19
  • 4 回答
  • 0 关注
  • 525 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号