这篇文章给大家介绍怎么在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项目中实现一个解释器模式