抽象类的使用很常见,比如模板模式中就会用到。将具体需要实现的下发到子类。例如生成一个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.
时间: 2024-10-23 12:53:37