久久久久久久av_日韩在线中文_看一级毛片视频_日本精品二区_成人深夜福利视频_武道仙尊动漫在线观看

老生常談PHP面向對象之解釋器模式

下面小編就為大家?guī)硪黄仙U凱HP面向對象之解釋器模式。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

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

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

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

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

上面這二行代碼雖然是作者發(fā)明的語言,但根據字面含義也不難理解,第一行是定義一個變量并賦值,第二行是對變量進行一個判斷(變量等于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類中的功能,看到下面的內容就會發(fā)現繼承他的類調用了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就是個接口,利用這個接口可以實現多態(tài),不知道自己裝B說的對不對,哈! 具體可以在看看原書的類圖)

三、LiteralExpression 文字表達式類,作用就是將一個字符串保存到InterpreterContext這個小容器里,保存成一個索引數組,例如保存開頭那二句自創(chuàng)代碼中的 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 變量表達式類,和上面類的作用是一樣的只不過數據將被保存成關聯(lián)數組,關聯(lián)數組中的健是變量名,值呢就是變量的值,例如開頭二句中的變量"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;
  }
}

【網站聲明】本站除付費源碼經過測試外,其他素材未做測試,不保證完整性,網站上部分源碼僅限學習交流,請勿用于商業(yè)用途。如損害你的權益請聯(lián)系客服QQ:2655101040 給予處理,謝謝支持。

相關文檔推薦

這篇文章主要介紹了PHP有序表查找之插值查找算法,簡單分析了插值查找算法的概念、原理并結合實例形式分析了php實現針對有序表插值查找的相關操作技巧,需要的朋友可以參考下
下面小編就為大家分享一篇ThinkPHP整合datatables實現服務端分頁的示例代碼,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
下面小編就為大家分享一篇PHP實現APP微信支付的實例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
這篇文章主要介紹了PHP實現的多維數組排序算法,結合實例形式對比分析了php針對多維數組及帶有鍵名的多維數組進行排序相關操作技巧與注意事項,需要的朋友可以參考下
這篇文章主要為大家詳細介紹了php結合ajaxuploadfile實現無刷新文件上傳功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
本篇文章給大家詳細介紹了PHP開發(fā)接口使用RSA進行加密解密方法,對此有興趣的朋友可以學習下。
主站蜘蛛池模板: 亚洲一区久久 | 欧美在线免费 | 蜜臀网 | 一色桃子av一区二区 | 亚洲一区二区 | 亚洲夜夜爽 | 欧美日韩亚 | 久久久影院 | 久久久久久九九九九九九 | 日本天堂视频 | 日日干天天操 | 一级全黄少妇性色生活免费看 | 狠狠操狠狠搞 | 热久久999 | 黄色三级免费 | 欧美精品三区 | 国产精品日韩在线 | 国产精品视频综合 | 午夜一区| 欧美日韩在线精品 | 日韩成人精品在线观看 | 免费在线观看av的网站 | 夜夜操操操| 天天操天天射综合 | 欧美黄色免费网站 | 国产色网站 | 日韩在线不卡 | a级片www| 日本又色又爽又黄又高潮 | 成人国产精品久久久 | 日韩av成人在线观看 | 国产精品久久久久婷婷二区次 | 日本高清不卡视频 | 天天干天天玩天天操 | 日日干夜夜干 | 91国产视频在线观看 | 伊人天堂网 | 99亚洲精品 | 97视频在线观看免费 | 日韩高清av | 在线欧美亚洲 |