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

首頁 > 語言 > PHP > 正文

PHP面向對象的解釋器模式

2024-09-04 11:43:51
字體:
來源:轉載
供稿:網友

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

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

$input="4";

$inputequals"4"or$inputequals"four";

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

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

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

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

  1. classInterpreterContext{ 
  2.  
  3.   private$expressionstore=array();//存放比較的值和結果  
  4.  
  5.   functionreplace(Expression$exp,$value){    // 設置值 
  6.  
  7.     $this->expressionstore[$exp->getKey()] =$value
  8.  
  9.   } 
  10.  
  11.   functionlookup(Expression$exp){        //獲取值 
  12.  
  13.     return$this->expressionstore[$exp->getKey()]; 
  14.  
  15.   } 
  16.  

這個類就像一個工具,供其他類來使用(它和其他類不存在繼承、組合或聚合的關系)。

二、Expression 這是一個表達式的抽象類,定義了抽象方法interpret() 和方法getKey(),代碼如下:

  1. abstractclassExpression { 
  2.  
  3.   privatestatic$keycount= 0;  //計數用的 
  4.  
  5.   private$key; //存放一個唯一值 

主要實現將前臺獲取到的數據存放到上述InterpreterContext類中的功能,看到下面的內容就會發現繼承他的類調用了InterpreterContext類的replace()方法:

  1. abstractfunctioninterpret (InterpreterContext$context); 
  2.  
  3. /獲取一個唯一值   
  4.  
  5. functiongetKey(){        
  6.  
  7.   if(!isset($this->key)){ 
  8.  
  9.     self::$keycount++; 
  10.  
  11.     $this->key= self::$keycount
  12.  
  13.   } 
  14.  
  15.   return$this->key; 
  16.  

下面將要講到的類都將繼承這個類,并且他和OperatorExpression(操作符表達式抽象類)是一個組合的關系,也就是說OperatorExpression在初始化時可以包含所有繼承了Expression的子類(這也是本書一直在強調的要面向接口編程,這個Expression就是個接口,利用這個接口可以實現多態,不知道自己裝B說的對不對,哈! 具體可以在看看原書的類圖)

三、LiteralExpression 文字表達式類,作用就是將一個字符串保存到InterpreterContext這個小容器里,保存成一個索引數組,例如保存開頭那二句自創代碼中的 4 或者 four,代碼如下:

  1. classLiteralExpressionextendsExpression{ 
  2.  
  3.   private$value;   
  4.  
  5.   function__construct ($value){      //初始化時傳入要保存的值 
  6.  
  7.     $this->value=$value
  8.  
  9.   } 
  10.  
  11.   functioninterpret(InterpreterContext$context){    //調用InterpreterContext類的replace()將$value保存到InterpreterContext這個小容器里 
  12.  
  13.     $context->replace($this,$this->value); 
  14.  
  15.   } 
  16.  

四、VariableExpression 變量表達式類,和上面類的作用是一樣的只不過數據將被保存成關聯數組,關聯數組中的健是變量名,值呢就是變量的值,例如開頭二句中的變量"input" 和值 "4",代碼如下:

  1. classVariableExpressionextendsExpression{ 
  2.  
  3.   private$name;    //變量名 
  4.  
  5.   private$val;      //變量值 
  6.  
  7.   function__construct ($name,$val=null){ 
  8.  
  9.     $this->name =$name
  10.  
  11.     $this->val =$val
  12.  
  13.   }
  14.  
  15.   functioninterpret(InterpreterContext$context){ 
  16.  
  17.     if(!is_null($this->val)){ 
  18.  
  19.       $context->replace($this,$this->val); 
  20.  
  21.       $this->val = null; 
  22.  
  23.     } 
  24.  
  25.   } 
  26.  
  27.   functionsetValue($value){  //用于設置變量的值 
  28.  
  29.     $this->val =$value
  30.  
  31.   } 
  32.  
  33.   functiongetKey(){    //這個復寫了父類的getKey()方法,在小容器InterpreterContext的lookup()方法調用這個類的實例的getKey()方法時 它將返回一個字符串(即變量名)而不是數字索引 
  34.  
  35.     return$this->name; 
  36.  
  37.   } 
  38.  
 

五、OperatorExpression 操作符表達式抽象基類,此類繼承且組合了Expression抽象基類,實現的interpret()方法主要保存表達式的計算結果,代碼如下:

  1. abstractclassOperatorExpressionextendsExpression{ 
  2.  
  3. protected$l_op;  //表達式左邊的值 
  4.  
  5. protected$r_op;  //表達式右邊的值 
  6.  
  7. function__construct (Expression$l_op,Expression$r_op){    //初始化時可組合繼承了Expression類的子類實例 
  8.  
  9. $this->l_op =$l_op
  10.  
  11. $this->r_op =$r_op
  12.  
  13.  
  14. functioninterpret(InterpreterContext$context){ //主要用于保存表達試的結果(保存到InterpreterContext 類的實例中) 
  15.  
  16. $this->l_op->interpret($context);        //將Expression子類實例的值或計算結果保存到InterpreterContext 類的實例中 
  17.  
  18. $this->r_op->interpret($context); 
  19.  
  20. $result_l=$context->lookup($this->l_op);    //獲取上一步的值或計算結果 
  21.  
  22. $result_r=$context->lookup($this->r_op); 
  23.  
  24. $this->doInterpret($context,$result_l,$result_r);  //具體的比較運算由繼承的子類來實現 
  25.  
  26.  
  27. protectedabstractfunctiondoInterpret(InterpreterContext$context,$result_l,$result_r); 
  28.  
  29.  

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

  1. //相等表達式 
  2.  
  3. classEqualsExpressionextendsOperatorExpression { 
  4.  
  5. protectedfunctiondoInterpret(InterpreterContext$context,$result_l,$result_r){ 
  6.  
  7. $context->replace($this,$result_l==$result_r); 
  8.  
  9.  
  10.  
  11. //或表達式 
  12.  
  13. classBooleanOrExpressionextendsOperatorExpression{ 
  14.  
  15. protectedfunctiondoInterpret(InterpreterContext$context,$result_l,$result_r){ 
  16.  
  17. $context->replace($this,$result_l||$result_r); 
  18.  
  19.  
  20.  
  21. //與表達式 
  22.  
  23. classBooleanAndExpressionextendsOperatorExpression{ 
  24.  
  25. protectedfunctiondoInterpret(InterpreterContext$context,$result_l,$result_r){ 
  26.  
  27. $context->replace($this,$result_l&&$result_r); 
  28.  
  29.  

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

客戶端代碼一:

  1. $context=newInterpreterContext(); 
  2.  
  3. $statement=newBooleanOrExpression (  //可嘗試將此操作符表達式換成BooleanAndExpression 運行一下 看看執行結果 
  4.  
  5. //可嘗試將LiteralExpression中實例化的參數改成其他值看看運算結果,或者直接將EqualsExpression對象換成BooleanOrExpression 或BooleanAndExpression  
  6.  
  7. newEqualsExpression(newLiteralExpression('four'),newLiteralExpression('four')),  
  8.  
  9. newEqualsExpression(newLiteralExpression('b'),newLiteralExpression(?')) 
  10.  
  11. ); 
  12.  
  13. $statement->interpret($context); 
  14.  
  15. if($context->lookup($statement)){ 
  16.  
  17. echo'條件成立' 
  18.  
  19. }else
  20.  
  21. echo'條件不成立' 
  22.  

客戶端代碼二:

  1. $context=newInterpreterContext(); 
  2.  
  3. $statement=newBooleanOrExpression( 
  4.  
  5. newBooleanAndExpression( 
  6.  
  7. newEqualsExpression(newLiteralExpression(?'),newLiteralExpression(?')), 
  8.  
  9. newEqualsExpression(newLiteralExpression(?'),newLiteralExpression(?')) 
  10.  
  11. ), 
  12.  
  13. newEqualsExpression(newLiteralExpression('b'),newLiteralExpression(?')) 
  14.  
  15. ); 
  16.  
  17. $statement->interpret($context); 
  18.  
  19. if($context->lookup($statement)){ 
  20.  
  21. echo'條件成立' 
  22.  
  23. }else
  24.  
  25. echo'條件不成立' 
  26.  

客戶端代碼三:

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

  1. $context=newInterpreterContext();     
  2.  
  3. $input=newVariableExpression('input');  //這里定義了一個變量input 但并未賦值 
  4.  
  5. $statement=newBooleanOrExpression( 
  6.  
  7. newEqualsExpression($input,newLiteralExpression('four')),  //這里變量表達式和文字表達式的值將進行一個是否相等的比較 
  8.  
  9. newEqualsExpression($input,newLiteralExpression(?')) 
  10.  
  11. ); 
  12.  
  13. foreach(array("four","4","52")as$val){ 
  14.  
  15. $input->setValue($val);        //對input這個變量賦值 
  16.  
  17. print"變量input的值為:$val
  18. "; 
  19.  
  20. $statement->interpret($context);  //進行比較并將比較結果存入InterpreterContext對象實例 
  21.  
  22. if($context->lookup($statement)){  //獲取比較的結果 
  23.  
  24. print"條件成立  
  25. "; 
  26.  
  27. }else
  28.  
  29. print"條件不成立  
  30. "; 
  31.  
  32.  

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

以上這篇PHP面向對象的解釋器模式就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持本網站。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲人成伊人成综合网久久久| 亚洲欧美综合另类中字| 色综合久久天天综线观看| 久久国产天堂福利天堂| 神马久久桃色视频| 欧美成人免费在线观看| 国产亚洲精品久久久久久牛牛| 久久这里有精品| 97久久精品人人澡人人爽缅北| 日本一本a高清免费不卡| 这里只有精品在线播放| 久久精品久久久久| 亚洲男女性事视频| 最新91在线视频| 亚洲精品福利在线| 久久影院在线观看| yellow中文字幕久久| 欧美丰满少妇xxxxx| 欧美黑人巨大精品一区二区| 日韩精品免费视频| 国产亚洲精品久久久久久牛牛| 欧美黑人极品猛少妇色xxxxx| 亚洲国产91色在线| 亚洲一区免费网站| 欧美亚洲在线观看| 26uuu另类亚洲欧美日本老年| 国产男女猛烈无遮挡91| www.99久久热国产日韩欧美.com| 国产一区二区三区日韩欧美| 一本色道久久88综合日韩精品| 亚洲精品中文字幕av| 久久久国产精品一区| 欧美亚洲午夜视频在线观看| 成人激情视频小说免费下载| 69av在线视频| 国产一区二区成人| 亚州av一区二区| 日本精品免费观看| 亚洲精品久久久一区二区三区| 亚洲午夜激情免费视频| 国产精品18久久久久久麻辣| 日韩在线观看免费全集电视剧网站| 国产97色在线|日韩| 久久久精品美女| 国产专区欧美专区| wwwwwwww亚洲| 日韩亚洲精品电影| 成人a视频在线观看| 日韩中文字幕视频在线| 亚洲精品v天堂中文字幕| 欧美成人午夜免费视在线看片| 中文字幕在线看视频国产欧美在线看完整| 国产美女精品视频免费观看| 国产精品久久久久久久app| 亚洲激情电影中文字幕| 亚洲欧美日韩精品久久亚洲区| 日韩在线视频国产| 国产精品视频久久| 2024亚洲男人天堂| 国产精品亚洲精品| 91在线网站视频| 亚洲第一在线视频| 成人黄色免费看| 一区二区三区美女xx视频| 668精品在线视频| 亚洲国产欧美在线成人app| 97人人模人人爽人人喊中文字| 亚洲男人天堂网| 亚洲无限乱码一二三四麻| 亚洲国产一区二区三区在线观看| 亚洲一区999| 成人黄色免费看| 91精品在线看| 成人免费视频网址| 欧美精品免费在线观看| 久久久久久国产精品三级玉女聊斋| 色一情一乱一区二区| 中日韩美女免费视频网址在线观看| 亚洲自拍中文字幕| 伊人久久久久久久久久| 欧美寡妇偷汉性猛交| 国产婷婷成人久久av免费高清| 久久97精品久久久久久久不卡| 欧美日韩亚洲成人| 国产亚洲欧美日韩美女| 亚洲韩国日本中文字幕| 国产精品91在线观看| 国产精品中文久久久久久久| 97国产精品视频| 欧美电影免费观看电视剧大全| 亚洲欧美日韩网| 97人洗澡人人免费公开视频碰碰碰| 亚洲欧洲偷拍精品| 久久亚洲春色中文字幕| 久久精品一偷一偷国产| 中日韩美女免费视频网址在线观看| 疯狂做受xxxx欧美肥白少妇| 最近2019年日本中文免费字幕| 国产亚洲欧美日韩美女| 中文字幕亚洲欧美| 亚洲娇小xxxx欧美娇小| 日韩精品在线影院| 日本午夜精品理论片a级appf发布| 日本道色综合久久影院| 久久国产精品影片| 97国产一区二区精品久久呦| 国产精品久久久久久av福利软件| 国产精品电影网站| 97热在线精品视频在线观看| 欧美一区二区三区图| 欧美性猛交xxxx免费看| 日韩在线免费视频观看| 欧美性xxxxx| 美女999久久久精品视频| 亚洲影院污污.| 久久综合伊人77777| 亚洲毛片一区二区| 亚洲a区在线视频| 中文字幕国产亚洲| 亚洲色无码播放| 91手机视频在线观看| 亚洲第一偷拍网| 亚洲免费小视频| 国产精品亚洲网站| 亚洲美女www午夜| 国产精品一区二区久久精品| 国产成人av在线| 91av在线看| 国产精品女人网站| 亚洲第一在线视频| 疯狂做受xxxx高潮欧美日本| 久久久久久高潮国产精品视| 色老头一区二区三区在线观看| 91久久精品美女高潮| 日韩精品中文字| 久久99亚洲精品| 国产视频欧美视频| 国产日产欧美a一级在线| 久久久久免费精品国产| 日韩在线观看免费高清完整版| 欧美性一区二区三区| 亚洲aⅴ日韩av电影在线观看| 久久亚洲精品国产亚洲老地址| 久久亚洲私人国产精品va| 日韩av在线一区| 欧美激情奇米色| 精品国产网站地址| 国内精品中文字幕| 91久久国产精品91久久性色| 日韩视频第一页| 国产91在线播放九色快色| 国产精品免费看久久久香蕉| 日本伊人精品一区二区三区介绍| 红桃av永久久久| 国产在线观看精品| 国产精品久久久久久久久久久久久| 欧美精品videos另类日本| 中文国产亚洲喷潮| 欧美成人精品在线播放| 久久久久亚洲精品国产| 国产精品日韩在线| 欧美日韩一区免费| 欧美在线视频一二三| 蜜臀久久99精品久久久久久宅男|