亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > PHP > 正文

PHP解釋器模式用法詳解

2020-03-22 18:56:27
字體:
來源:轉載
供稿:網友
下面小編就為大家帶來一篇老生常談PHPhtml' target='_blank'>面向對象之解釋器模式。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

最近在看 “深入PHP面向對象模式與實踐” ,學習書中的內容后瞬間覺得自己有點高大上了,哈 ! 其實還是個菜B。相信也會有新手朋友在看這本(我自己也是新手),對書中我個人認為比較難的內容的學習心得就想拿出來分享和交流,1是希望對自己所學知識能夠起到鞏固和加深理解的作用 2是希望對看到本文且感興趣的新手朋友一些幫助。

這部分內容看了好幾遍了代碼也跟著敲了幾遍,估計本文想要實現的功能大概就是用戶在web頁面上輸入一些內容,然后通過后臺程序解析后進行回復(感覺就是在廢話)。例如我在前臺web頁面輸入框里輸入:


$input = "4";$input equals "4" or $input equals "four";

然后提交,系統就會回復類似 “條件成立” 或者 “條件不成立”的結果(有點類似直接在前臺寫代碼并運行,后臺解析后會返回一個結果。原書中雖然沒有講解整個前臺輸入到后臺解析的過程但我猜這個后臺解析應該還有一個使用正則表達式提取類似上面2行代碼中關鍵字的過程)

上面這二行代碼雖然是作者發明的語言,但根據字面含義也不難理解,第一行是定義一個變量并賦值,第二行是對變量進行一個判斷(變量等于4或者等于four)。

廢話不多說來看看這個模式定義的這幾個類 (類圖請自行看原文):

一、interpreterContext 這個類就像一個容器 主要是用來存放和獲取需要進行比較的值和比較的結果的,例如上述代碼中的4, four,和比較結果 “true”或“false”,保存的形式是數組即類的屬性$expressionstore,代碼如下:


class InterpreterContext{  private $expressionstore = array(); //存放比較的值和結果    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;  //計數用的  private $key;          //存放一個唯一值  //主要實現將前臺獲取到的數據存放到上述InterpreterContext類中的功能,看到下面的內容就會發現繼承他的類調用了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的子類(這也是本書一直在強調的要面向接口編程,這個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);}

六、EqualsExpression、BooleanOrExpression、BooleanAndExpression,分別為繼承了OperatorExpression 抽象基類的相等表達式、或表達式、與表達式只有一個方法doInterpret()內部調用了InterpreterContext類的replace()方法將表達式的計算結果保存到InterpreterContext類的實例中

代碼如下:


//相等表達式class EqualsExpression extends OperatorExpression {protected function doInterpret(InterpreterContext $context,$result_l,$result_r){$context->replace($this,$result_l == $result_r);}}//或表達式class BooleanOrExpression extends OperatorExpression{protected function doInterpret(InterpreterContext $context,$result_l,$result_r){$context->replace($this,$result_l || $result_r);}}//與表達式class BooleanAndExpression extends OperatorExpression{protected function doInterpret(InterpreterContext $context,$result_l,$result_r){$context->replace($this,$result_l && $result_r);}}

到此為止此模式相關的類就介紹完畢,上述代碼都是進過測試的,可直接復制粘貼運行來查看結果,現在我們就來看看客戶端代碼:

客戶端代碼一:


$context = new InterpreterContext();$statement = new BooleanOrExpression (  //可嘗試將此操作符表達式換成BooleanAndExpression 運行一下 看看執行結果//可嘗試將LiteralExpression中實例化的參數改成其他值看看運算結果,或者直接將EqualsExpression對象換成BooleanOrExpression 或BooleanAndExpression new EqualsExpression(new LiteralExpression('four'),new LiteralExpression('four')), new EqualsExpression(new LiteralExpression('b'),new LiteralExpression('4')));$statement->interpret($context);if($context->lookup($statement)){echo '條件成立';} else {echo '條件不成立';}

客戶端代碼二:


$context = new InterpreterContext();$statement = new BooleanOrExpression(new BooleanAndExpression(new EqualsExpression(new LiteralExpression('4'),new LiteralExpression('4')),new EqualsExpression(new LiteralExpression('4'),new LiteralExpression('4'))),new EqualsExpression(new LiteralExpression('b'),new LiteralExpression('4')));$statement->interpret($context);if($context->lookup($statement)){echo '條件成立';} else {echo '條件不成立';}

客戶端代碼三:

這是原文的客戶端代碼實例和上述客戶端代碼的區別在于使用了變量表達式VariableExpression


$context = new InterpreterContext();    $input = new VariableExpression('input');  //這里定義了一個變量input 但并未賦值$statement = new BooleanOrExpression(new EqualsExpression($input,new LiteralExpression('four')),  //這里變量表達式和文字表達式的值將進行一個是否相等的比較new EqualsExpression($input,new LiteralExpression('4')));foreach (array("four","4","52") as $val){$input->setValue($val);        //對input這個變量賦值print "變量input的值為:$val:<br/>";$statement->interpret($context);  //進行比較并將比較結果存入InterpreterContext對象實例if($context->lookup($statement)){  //獲取比較的結果print "條件成立 <br/>";} else {print "條件不成立 <br/>";}}

上述代碼經過測試都可以正常運行,有需要的朋友可以復制下來,運行一下看看結果。

以上就是PHP解釋器模式用法詳解的詳細內容,更多請關注 其它相關文章!

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
丝袜美腿亚洲一区二区| 久久精品成人一区二区三区| 日韩视频免费看| 欧美高清视频在线观看| 久久精品成人欧美大片古装| 精品人伦一区二区三区蜜桃网站| 一本色道久久综合狠狠躁篇怎么玩| 亚洲欧美成人一区二区在线电影| 国产日韩欧美自拍| 91久久在线视频| 亚洲第一页在线| 日韩国产高清视频在线| xvideos亚洲| 久久在线免费视频| 欧美在线视频观看| 成人在线一区二区| 色一情一乱一区二区| 91精品国产高清久久久久久| 日韩激情片免费| 亚洲精品自拍第一页| 国产精品久久久av久久久| 97超级碰碰碰久久久| 欧美一级视频在线观看| 成人日韩av在线| 亚洲色图50p| 久久精品视频在线| 91精品国产综合久久久久久久久| 亚洲日本欧美中文幕| 国产亚洲美女精品久久久| 欧美精品久久一区二区| 国产亚洲激情视频在线| 8x海外华人永久免费日韩内陆视频| 国产亚洲精品一区二555| 久久久中精品2020中文| 欧美成人免费网| 北条麻妃一区二区三区中文字幕| 亚洲人成网站免费播放| 日韩av电影中文字幕| 51久久精品夜色国产麻豆| 色先锋资源久久综合5566| 中文字幕欧美视频在线| 福利视频导航一区| 亚洲天堂av电影| 亚洲xxxx3d| 美日韩精品免费视频| www日韩中文字幕在线看| 日韩在线一区二区三区免费视频| 国产一区二区在线免费| 国产精品老女人视频| 亚洲欧洲一区二区三区在线观看| 国产一区二区欧美日韩| 国产精品视频最多的网站| 高清亚洲成在人网站天堂| 国产精品日韩专区| 日韩少妇与小伙激情| 在线成人免费网站| 久久精品国产一区二区三区| 国产亚洲在线播放| 欧美专区在线视频| 国产精品流白浆视频| 欧美激情精品久久久| 国产日韩精品一区二区| 久久国产精品久久久久久久久久| 色综合久久天天综线观看| 美女视频黄免费的亚洲男人天堂| 国产精品久久久久久久久久久久久| 欧美洲成人男女午夜视频| 亚洲天天在线日亚洲洲精| 久久久亚洲影院你懂的| 中文字幕一区二区精品| 亚洲国产成人精品一区二区| 亚洲日韩中文字幕在线播放| 亚洲精品中文字幕有码专区| 亚洲va欧美va在线观看| 日本一欧美一欧美一亚洲视频| 亚洲在线视频观看| 亚洲精品永久免费精品| 欧美大片大片在线播放| 91亚洲午夜在线| 国产97在线观看| 色狠狠av一区二区三区香蕉蜜桃| 精品高清美女精品国产区| 日本欧美中文字幕| 国产欧美婷婷中文| 久久久久亚洲精品| 国产精品丝袜一区二区三区| 久久精品国产久精国产一老狼| 日韩精品免费在线| 欧美猛少妇色xxxxx| 久久久国产一区| 成人久久精品视频| 成人在线视频网| 欧美激情综合色| 狠狠干狠狠久久| 91免费的视频在线播放| 青青草国产精品一区二区| 亚洲www在线| 亚洲国产精品久久91精品| 久久精品免费电影| 57pao成人国产永久免费| 影音先锋欧美精品| 亚洲乱码一区二区| 国产精品一区二区三区毛片淫片| 久久久久久亚洲精品中文字幕| 欧美激情亚洲国产| 色噜噜国产精品视频一区二区| 亚洲新中文字幕| 国产综合久久久久| 日韩视频永久免费观看| 亚洲一区制服诱惑| 91精品视频播放| 国产一区二区三区视频| 欧美日韩国产综合视频在线观看中文| 日韩资源在线观看| 亚洲香蕉av在线一区二区三区| 97在线精品视频| 亚洲精品久久久久国产| 午夜精品国产精品大乳美女| 日韩麻豆第一页| 一区二区三区高清国产| 欧美怡红院视频一区二区三区| 亚洲精品乱码久久久久久金桔影视| 国产精品视频网| 欧美限制级电影在线观看| 在线观看日韩视频| 最近2019中文字幕第三页视频| 欧美日韩激情网| 久久精品视频一| 国产精品久久久久高潮| 中文一区二区视频| 国产亚洲精品美女久久久久| 91国内产香蕉| 2019国产精品自在线拍国产不卡| 久久久久久尹人网香蕉| 一本大道香蕉久在线播放29| 欧美精品18videos性欧| 国产精品第一区| 岛国精品视频在线播放| 国产精品爽爽ⅴa在线观看| 97成人在线视频| 亚洲精品乱码久久久久久金桔影视| 久久国产精品久久久久| 国产香蕉97碰碰久久人人| 久久伊人精品天天| 欧美激情成人在线视频| 日韩精品视频免费在线观看| 91网在线免费观看| 韩日欧美一区二区| 欧美一级片免费在线| 国产精品精品久久久| 奇米四色中文综合久久| 国产欧美精品xxxx另类| 欧美成人亚洲成人日韩成人| 国产成人免费av| 欧美中文在线观看国产| 亚洲三级av在线| 精品国产精品自拍| 日韩av观看网址| 欧美国产日本高清在线| 国产成人一区二区三区小说| 日韩一中文字幕| 亚洲精品720p| 中文字幕在线精品| 91免费看片网站|