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