下面将要讲到的类都将继承这个类,并且他和OperatorExpression(操作符表达式抽象类)是一个组合的关系,也就是说OperatorExpression在初始化时可以包含所有继承了Expression的子类(这也是本书一直在强调的要面向接口编程,这个Expression就是个接口,利用这个接口可以实现多态,不知道自己装B说的对不对,哈! 具体可以在看看原书的类图)
三、LiteralExpression 文字表达式类,作用就是将一个字符串保存到InterpreterContext这个小容器里,保存成一个索引数组,例如保存开头那二句自创代码中的 4 或者 four
class LiteralExpression extends Expression{
private $value;
function __construct ($value){ //初始化时传入要保存的值
$this->value= $value;
}
function interpret(InterpreterContext $context){ //调用InterpreterContext类的replace()将$value保存到InterpreterContext这个小容器里
$context->replace($this,$this->value);
}
}
四、VariableExpression 变量表达式类,和上面类的作用是一样的只不过数据将被保存成关联数组,关联数组中的健是变量名,值呢就是变量的值,例如开头二句中的变量"input" 和值 "4",
class VariableExpression extends Expression{
private $name; //变量名
private $val; //变量值
function __construct ($name,$val=null){
$this->name = $name;
$this->val = $val;
}
function interpret(InterpreterContext $context){
if(!is_null($this->val)){
$context->replace($this,$this->val);
$this->val = null;
}
}
function setValue($value){ //用于设置变量的值
$this->val = $value;
}
function getKey(){ //这个复写了父类的getKey()方法,在小容器InterpreterContext的lookup()方法调用这个类的实例的getKey()方法时 它将返回一个字符串(即变量名)而不是数字索引
return $this->name;
}
}
五、OperatorExpression 操作符表达式抽象基类,此类继承且组合了Expression抽象基类,实现的interpret()方法主要保存表达式的计算结果
abstract class OperatorExpression extends Expression{
protected $l_op; //表达式左边的值
protected $r_op; //表达式右边的值
function __construct (Expression $l_op,Expression $r_op){ //初始化时可组合继承了Expression类的子类实例
$this->l_op = $l_op;
$this->r_op = $r_op;
}
function interpret(InterpreterContext $context){ //主要用于保存表达试的结果(保存到InterpreterContext 类的实例中)
$this->l_op->interpret($context); //将Expression子类实例的值或计算结果保存到InterpreterContext 类的实例中
$this->r_op->interpret($context);
$result_l = $context->lookup($this->l_op); //获取上一步的值或计算结果
$result_r = $context->lookup($this->r_op);
$this->doInterpret($context,$result_l,$result_r); //具体的比较运算由继承的子类来实现
}
protected abstract function doInterpret(InterpreterContext $context,$result_l,$result_r);
}







