怎么在PHP项目中实现一个解释器模式

  介绍

这篇文章给大家介绍怎么在PHP项目中实现一个解释器模式,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

<强>一、interpreterContext这个类就像一个容器主要是用来存放和获取需要进行比较的值和比较的结果的,例如上述代码中的4,4、和比较结果“true”或“false”,保存的形式是数组即类的属性expressionstore美元,代码如下:

class  interpreterContext {   private 才能;expressionstore 美元;=,数组();,//存放比较的值和结果   ,,   function 才能取代(Expression  exp美元,美元值){//,设置值   ,,,这个→美元expressionstore (exp→美元getKey()],=,美元价值;   ,,}   ,,   function 才能查找(Expression  exp美元){//获取值   ,,,return  $ this→expressionstore (exp→美元getKey ());   ,,}   }

这个类就像一个工具,供其他类来使用(它和其他类不存在继承,组合或聚合的关系)。

<强>二,表达这是一个表达式的抽象类,定义了抽象方法解释()和方法getKey()

代码如下:

abstract  class  Expression  {   private 才能;static  keycount 美元;=,0;//计数用的   private 才能;美元关键;//存放一个唯一值//主才能要实现将前台获取到的数据存放到上述InterpreterContext类中的功能,看到下面的内容就会发现继承他的类调用了InterpreterContext类的替代()方法   abstract 才能;function  interpret  (InterpreterContext 上下文美元);//获取一个唯一值,,   function 才能;getKey () {   ,,,如果(!收取($ this→键)){   ,,,,,self:: $ keycount + +;   ,,,,,这个美元→键=,self:: $ keycount;   ,,,}   ,,,return  $ this→键;   ,,}   }

下面将要讲到的类都将继承这个类,并且他和OperatorExpression(操作符表达式抽象类)是一个组合的关系,也就是说OperatorExpression在初始化时可以包含所有继承了表达式的子类(这也是本书一直在强调的要面向接口编程,这就个表达式是个接口,利用这个接口可以实现多态,不知道自己装B说的对不,对哈!具体可以在看看原书的类图)

<强>三,LiteralExpression文字表达式类,作用就是将一个字符串保存到InterpreterContext这个小容器里,保存成一个索引数组,例如保存开头那二句自创代码中的4或者四

代码如下:

class  LiteralExpression  extends 表达{   private 才能;价值;美元,,   function 才能;__construct (美元值){//初始化时传入要保存的值   ,,,这个→美元价值=https://www.yisu.com/zixun/美元价值;   }   功能解释(InterpreterContext上下文美元){//调用InterpreterContext类的替代()将美元价值保存到InterpreterContext这个小容器里   (上下文->取代美元,$ this ->值);   }   }

<强>四,VariableExpression变量表达式类,和上面类的作用是一样的只不过数据将被保存成关联数组,关联数组中的健是变量名,值呢就是变量的值,例如开头二句中的变量“input"和值“4“,

代码如下:

class  VariableExpression  extends 表达{   private 才能;$名称;//变量名   private 才能,val美元;//变量的值   ,,   function 才能;__construct (名字,val美元=null) {   ,,,这个→美元name =,美元名称;   ,,,这个→美元val =, val美元;   ,,}   ,,   function 才能解释(InterpreterContext 上下文美元){   ,,,如果(! is_null ($ this→val)) {   ,,,,,上下文→美元取代(这个,这个→美元val);   ,,,,,这个→美元val =,空;   ,,,}   ,,}   ,,   function 才能setValue(美元值){//用于设置变量的值   ,,,这个→美元val =,美元价值;   ,,}   ,,   function 才能;getKey(){//这个复写了父类的getKey()方法,在小容器InterpreterContext的lookup()方法调用这个类的实例的getKey()方法时,它将返回一个字符串(即变量名)而不是数字索引   ,,,return  $ this→名称;   ,,}   }

<强>五,OperatorExpression操作符表达式抽象基类,此类继承且组合了表达式抽象基类,实现的解释()方法主要保存表达式的计算结果

代码如下:

abstract  class  OperatorExpression  extends 表达{   protected  l_op美元;//表达式左边的值   protected  r_op美元;//表达式右边的值      function  __construct  (Expression  l_op美元,Expression  r_op美元){//初始化时可组合继承了表达类的子类实例=$ this→l_op  l_op美元;=$ this→r_op  r_op美元;   }      function 解释(InterpreterContext  $上下文){//主才能要用于保存表达试的结果(保存到InterpreterContext 类的实例中)   $ this→l_op→解释(上下文);//将表达子类实例的值或计算结果保存到InterpreterContext 类的实例中   $ this→r_op→解释(上下文);   result_l 美元;=,美元上下文→查找($ this→l_op);//获取上一步的值或计算结果   result_r 美元;=,美元上下文→查找($ this→r_op);   $ this→doInterpret(上下文,result_l美元,result_r美元);//具体的比较运算由继承的子类来实现   }      protected  abstract  function  doInterpret (InterpreterContext 背景下,美元result_l美元,美元result_r);      }

怎么在PHP项目中实现一个解释器模式