最近在看 “深入PHP面向?qū)ο竽J脚c實踐” ,學習書中的內(nèi)容后瞬間覺得自己有點高大上了,哈 ! 其實還是個菜B。相信也會有新手朋友在看這本(我自己也是新手),對書中我個人認為比較難的內(nèi)容的學習心得就想拿出來分享和交流,1是希望對自己所學知識能夠起到鞏固和加深理解的作用 2是希望對看到本文且感興趣的新手朋友一些幫助。
這部分內(nèi)容看了好幾遍了代碼也跟著敲了幾遍,估計本文想要實現(xiàn)的功能大概就是用戶在web頁面上輸入一些內(nèi)容,然后通過后臺程序解析后進行回復(感覺就是在廢話)。例如我在前臺web頁面輸入框里輸入:
$input = "4"; $input equals "4" or $input equals "four";
然后提交,系統(tǒng)就會回復類似 “條件成立” 或者 “條件不成立”的結(jié)果(有點類似直接在前臺寫代碼并運行,后臺解析后會返回一個結(jié)果。原書中雖然沒有講解整個前臺輸入到后臺解析的過程但我猜這個后臺解析應該還有一個使用正則表達式提取類似上面2行代碼中關鍵字的過程)
上面這二行代碼雖然是作者發(fā)明的語言,但根據(jù)字面含義也不難理解,第一行是定義一個變量并賦值,第二行是對變量進行一個判斷(變量等于4或者等于four)。
廢話不多說來看看這個模式定義的這幾個類 (類圖請自行看原文):
一、interpreterContext 這個類就像一個容器 主要是用來存放和獲取需要進行比較的值和比較的結(jié)果的,例如上述代碼中的4, four,和比較結(jié)果 “true”或“false”,保存的形式是數(shù)組即類的屬性$expressionstore,代碼如下:
class InterpreterContext{ private $expressionstore = array(); //存放比較的值和結(jié)果 function replace(Expression $exp,$value){ // 設置值 $this->expressionstore[$exp->getKey()] = $value; } function lookup(Expression $exp){ //獲取值 return $this->expressionstore[$exp->getKey()]; } }
這個類就像一個工具,供其他類來使用(它和其他類不存在繼承、組合或聚合的關系)。
二、Expression 這是一個表達式的抽象類,定義了抽象方法interpret() 和方法getKey()
代碼如下:
abstract class Expression { private static $keycount = 0; //計數(shù)用的 private $key; //存放一個唯一值 //主要實現(xiàn)將前臺獲取到的數(shù)據(jù)存放到上述InterpreterContext類中的功能,看到下面的內(nèi)容就會發(fā)現(xiàn)繼承他的類調(diào)用了InterpreterContext類的replace()方法 abstract function interpret (InterpreterContext $context); //獲取一個唯一值 function getKey(){ if(!isset($this->key)){ self::$keycount++; $this->key= self::$keycount; } return $this->key; } }
下面將要講到的類都將繼承這個類,并且他和OperatorExpression(操作符表達式抽象類)是一個組合的關系,也就是說OperatorExpression在初始化時可以包含所有繼承了Expression的子類(這也是本書一直在強調(diào)的要面向接口編程,這個Expression就是個接口,利用這個接口可以實現(xiàn)多態(tài),不知道自己裝B說的對不對,哈! 具體可以在看看原書的類圖)
三、LiteralExpression 文字表達式類,作用就是將一個字符串保存到InterpreterContext這個小容器里,保存成一個索引數(shù)組,例如保存開頭那二句自創(chuàng)代碼中的 4 或者 four
代碼如下:
class LiteralExpression extends Expression{ private $value; function __construct ($value){ //初始化時傳入要保存的值 $this->value= $value; } function interpret(InterpreterContext $context){ //調(diào)用InterpreterContext類的replace()將$value保存到InterpreterContext這個小容器里 $context->replace($this,$this->value); } }
四、VariableExpression 變量表達式類,和上面類的作用是一樣的只不過數(shù)據(jù)將被保存成關聯(lián)數(shù)組,關聯(lián)數(shù)組中的健是變量名,值呢就是變量的值,例如開頭二句中的變量"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()方法調(diào)用這個類的實例的getKey()方法時 它將返回一個字符串(即變量名)而不是數(shù)字索引 return $this->name; } }