快速业务通道

静态类的原罪

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-05-23
解决了Mock的问题,但是首先它修改的原有的代码,违反了开闭原则,其次它引入了静态变量,而静态变量是共享的状态,有可能会干扰其它代码的执行,所以并不是一个完美的解决方案。

  补充说明,利用动态语言的特性,其实可以简单的通过require一个不同的类定义文件来实现Mock,但这样做同样有弊端,设想我们在脚本里需要多次变换实现方式,但实际上我们只有一次require的机会,否则就会出现重复定义的错误。

  注:某些情况下,利用静态延迟绑定也可以提高静态类的可测试性,参考PHPUnit。

  对象的价值

  如果放弃静态类,转而使用对象,应该如何实现文章管理系统的例子?代码如下:

  1. <?php  
  2.  
  3. class Article  
  4. {  
  5.     private $dao;  
  6.  
  7.     public function __construct($dao = null)  
  8.     {  
  9.         if ($dao === null) {  
  10.             $dao = new ArticleDAO();  
  11.         }  
  12.  
  13.         $this->setDao($dao);  
  14.     }  
  15.  
  16.     public function setDao($dao)  
  17.     {  
  18.         $this->dao = $dao;  
  19.     }  
  20.  
  21.     public function save()  
  22.     {  
  23.         $this->dao->save();  
  24.     }  
  25. }  
  26.  
  27. ?> 

  实际上,这里用到了人们常说的依赖注入技术,通过构造器或者Setter注入依赖的对象:

  1. <?php  
  2.  
  3. $article = new Article(new MockArticleDAO());  
  4.  
  5. $article->save();  
  6.  
  7. ?> 

  对象有自己的状态,不会发生共享状态干扰其它代码的执行的情况。

  …

  当然,静态类有好的一面,比如说很适合实现一些无状态的工具类,但多数时候,我的主观倾向很明确,多用对象,少用静态类,避免系统过早的固化。顺便说一句,希望别有人告诉我静态类比对象快之类的说教,谢谢。

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号