标签:
抽象类的使用很常见,比如模板模式中就会用到。将具体需要实现的下发到子类。例如生成一个sitemap.xml的实现:
abstract class SiteMap
{
function toXml()
{
do something ...
$this->loadData();
do something ...
}
abstract function loadData();
}
class BaiduSiteMap
{
function loadData()
{
//需要用户自己实现的部分,被下放到子类
}
}
以上是比较常用的方法。
最近看到php yii2.0是发现 base/action 类其实很适合这种场景,但是作者确没有用抽象类来做。我想作者肯定有什么不为人知的企图。
public function runWithParams($params)
{
if (!method_exists($this, ‘run‘)) {
throw new InvalidConfigException(get_class($this) . ‘ must define a "run()" method.‘);
}
$args = $this->controller->bindActionParams($this, $params);
Yii::trace(‘Running action: ‘ . get_class($this) . ‘::run()‘, __METHOD__);
if (Yii::$app->requestedParams === null) {
Yii::$app->requestedParams = $args;
}
if ($this->beforeRun()) {
$result = call_user_func_array([$this, ‘run‘], $args);
$this->afterRun();
return $result;
} else {
return null;
}
}
其中run方法就很适合嘛,为啥非要去 用method_exists去检查,不如直接定义为抽象方法,然后留给子类去实现不挺好。
细看才发现作者为了能实现run方法在子类的定义可变参数个数,而如果试用抽象方法这种形式,子类不能达到实现可变参数的效果,所以这样
换了条思路。总之想让代码达到什么效果,只要能订好规则就ok.
标签:
原文地址:http://www.cnblogs.com/pursuit-happiness/p/4733576.html