php - 组合与继承依赖注入(inject)

标签 php language-agnostic

我有一个包含三类对象的解析器:解析器本身、TokenState。解析器从词法分析器生成标记。一切都是黑盒的,所以 token 对解析器状态或解析器一无所知,状态对 token 一无所知。一个相当简单的安排版本:

class Parser {
   public function parse() {
      $this->state = new StEmpty;
      while ($token = $this->lexer->get()) {
         $this->state = $this->token->expect($this);
      }
   }
   public function stateStart() {
      return $this->state->stateStart();
   }
}
class StartToken {
   public function expect(Parser $parser) {
      return $parser->stateStart();
   }
}
class StEmpty {
   public function stateStart() {
      return new StStart;
   }
}

我遇到的问题是,有时当状态发生变化时,解析器需要采取一些行动(例如,在达到结束规则标记时向树中添加一条规则)。只有 State 知道这一点,因此由 state 告诉解析器该做什么。问题是让 Parser 进入 State。我可以在状态构造函数中注入(inject) Parser,但不是每个 State 都需要解析器,这会导致大量重复代码(除非我有一个基类StateParser 是 protected 成员,但我想避免扩展任何内容)。我也可以在需要它的 state 方法中注入(inject) Parser ,但我有一个类似的问题:那会是很多重复,而不是所有的 State 实现需要给定方法的解析器。

所以我的问题是如何让 State 在需要时了解 Parser 而无需不必要的继承或代码重复?如果我需要另一个完全可以接受的类(class)。


如果这很难理解,这里是一个“解开”的版本:

class Parser {
   public function parse() {
      $this->state = 'StEmpty';

      while ($token = $this->lexer->get()) {
         switch ($token) {
            case 'StartToken':
               switch ($this->state) {
                  case 'StEmpty':
                     $this->state = 'StStart';
                     break;
               }
               break;
         }
      }
   }
}

这个问题的答案也适用于其他语言,但我知道在允许重载的语言中这样做会更容易。 PHP 没有。

最佳答案

PHP 5.4 引入了特征:http://php.net/manual/en/language.oop5.traits.php

也许您可以使用 traits 作为继承和注入(inject)之间的中间地带。

关于php - 组合与继承依赖注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10303604/

相关文章:

regex - 我怎样才能模式匹配类似于正则表达式的标记?

php - 十月安装

php - 什么可以防止覆盖服务器中的 Access-Control-Allow-Origin?

php - 将我的站点从 XAMPP 上传到 Apache 公共(public)主机

language-agnostic - 词法作用域和静态作用域有什么区别?

algorithm - 从具有容错性的多个值生成唯一 ID

php - 如果我使用 use 导入类,我应该在 PHPDoc 中使用 FQN 吗?

php - 如何在 PHP 项目中找到未使用的函数

python - 二进制搜索 "infinite"序列。我从哪说起呢?

silverlight - 开发经典 UI 还是大胆采用更新的设计?