background image

public function save()
{
ArticleDAO::save();
}
}
?>

Article 实现必要的领域逻辑,然后把数据持久化交给 ArticleDAO 去做,而 ArticleDAO 是
一个静态类,就好像焊在主板上的集成显卡一样难以改变,假设我们为了测试代码可能
需要 Mock 掉 ArticleDAO 的实现,但因为调用时使用的是静态类的名字,等同于已经绑
定了具体的实现方式,Mock 几乎不可能,当然,实际上有一些方法可以实现:

 

复制代码 代码如下:

<?php
class Article
{
private static $dao = 'ArticleDAO';
public static funciton setDao($dao)
{
self::$dao = $dao;
}
public static function save()
{
$dao = self::$dao;
$dao::save();
}
}
?>

有了变量的介入,可以在运行时设定具体使用哪个静态类:

 

复制代码 代码如下:

<?php
Article::setDao('MockArticleDAO');
Article::save();
?>

虽然这样的实现方式看似解决了 Mock 的问题,但是首先它修改的原有的代码,违反了
开闭原则,其次它引入了静态变量,而静态变量是共享的状态,有可能会干扰其它代码
的执行,所以并不是一个完美的解决方案。
补充说明,利用动态语言的特性,其实可以简单的通过 require 一个不同的类定义文件来
实现 Mock,但这样做同样有弊端,设想我们在脚本里需要多次变换实现方式,但实际上