重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
这篇文章主要介绍了PHP延迟静态绑定的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。
公司主营业务:网站设计、成都网站设计、移动网站开发等业务。帮助企业客户真正实现互联网宣传,提高企业的竞争能力。创新互联公司是一支青春激扬、勤奋敬业、活力青春激扬、勤奋敬业、活力澎湃、和谐高效的团队。公司秉承以“开放、自由、严谨、自律”为核心的企业文化,感谢他们对我们的高要求,感谢他们从不同领域给我们带来的挑战,让我们激情的团队有机会用头脑与智慧不断的给客户带来惊喜。创新互联公司推出宝塔免费做网站回馈大家。嗅到了坏的味道
这段时间看项目后台的PHP代码,看到了类似于以下的一段代码,我把它抽出来:
get(); } $dbHandler = MySQLHandler::create(); get($dbHandler); ?>
有没有嗅到坏代码的味道?可以看到,在MySQLHandler和MemcachedHandler类中,都有一个create函数,除掉我的输出语句,发现它们一模一样,这就是代码冗余。是的,需要进行代码重构。
进行简单的重构
代码重构无处不在,只要你想,你觉的有改进,就需要敲起键盘开始干活。来吧,对上面的代码进行重构,如下:
get(); } $dbHandler = MySQLHandler::create(); get($dbHandler); ?>
将create函数移到DBHandler类中,看起来还不错,至少少了一坨那糟糕的代码。
貌似是错的
运行一下,却发现,并没有打印出我们期望的MySQL get()
。什么情况?这说明,并没有调用MySQLHandler的get函数,但是代码明明调用了啊,这说明,new self()
这句代码有问题。这有什么问题?这就需要说到今天总结的重点了————延迟静态绑定。
延迟静态绑定
在PHP5.3以后引入了延迟静态绑定。再看下面这段代码:
上面的代码输出了A,但是我希望它输出B,这就是问题的所在。这也是 self 和 __CLASS__ 的限制。使用 self:: 或者 __CLASS__ 对当前类的静态引用,取决于定义当前方法所在的类。所以,这就很好的解释了为什么上面的代码输出了A。但是,如果我们需要输出B呢?可以这么干:
后期静态绑定本想通过引入一个新的关键字表示运行时最初调用的类来绕过限制。简单地说,这个关键字能够让你在上述例子中调用 test() 时引用的类是 B 而不是 A。最终决定不引入新的关键字,而是使用已经预留的 static 关键字。
这就是后期静态绑定的根本————static关键字的另类用法。对于文章一开始的例子,可以这么改:
return new static(); // 改变这里,后期静态绑定
这种使用后期静态绑定,在使用PHP实现23中设计模式的时候,你会感到很轻松的。
感谢你能够认真阅读完这篇文章,希望小编分享的“PHP延迟静态绑定的示例分析”这篇文章对大家有帮助,同时也希望大家多多支持创新互联网站建设公司,,关注创新互联行业资讯频道,更多相关知识等着你来学习!