欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

老生常談PHP面向?qū)ο笾忉屍髂J?/h1>
 更新時間:2017年05月17日 07:48:33   投稿:jingxian  
下面小編就為大家?guī)硪黄仙U凱HP面向?qū)ο笾忉屍髂J?。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

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

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

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

一、interpreterContext 這個類就像一個容器 主要是用來存放和獲取需要進行比較的值和比較的結果的,例如上述代碼中的4, four,和比較結果 “true”或“false”,保存的形式是數(shù)組即類的屬性$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;  //計數(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;
  }
}

五、OperatorExpression 操作符表達式抽象基類,此類繼承且組合了Expression抽象基類,實現(xiàn)的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);  //具體的比較運算由繼承的子類來實現(xiàn)
}

protected abstract function doInterpret(InterpreterContext $context,$result_l,$result_r);

}

六、EqualsExpression、BooleanOrExpression、BooleanAndExpression,分別為繼承了OperatorExpression 抽象基類的相等表達式、或表達式、與表達式只有一個方法doInterpret()內(nèi)部調(diào)用了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);
}
}

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

客戶端代碼一:

$context = new InterpreterContext();

$statement = new BooleanOrExpression (  //可嘗試將此操作符表達式換成BooleanAndExpression 運行一下 看看執(zhí)行結果

//可嘗試將LiteralExpression中實例化的參數(shù)改成其他值看看運算結果,或者直接將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 '條件不成立';
}

客戶端代碼三:

這是原文的客戶端代碼實例和上述客戶端代碼的區(qū)別在于使用了變量表達式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/>";
}
}

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

以上這篇老生常談PHP面向?qū)ο笾忉屍髂J骄褪切【幏窒斫o大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • PHP中func_get_args(),func_get_arg(),func_num_args()的區(qū)別

    PHP中func_get_args(),func_get_arg(),func_num_args()的區(qū)別

    我們再看一下PHP的這三個函數(shù)[unc_get_arg(),func_get_args(),func_num_args()]的區(qū)別,我們先看一下,下面的實例代碼
    2013-09-09
  • PHP使用OCR技術識別圖片中的文字(無需接口)

    PHP使用OCR技術識別圖片中的文字(無需接口)

    tesseract-ocr是一個流行的開源OCR引擎庫,它使用C++編寫,?PHP作為一種流行的服務器端語言,也提供了一些ocr識別的庫和工具,可以通過tesseract-ocr識別PDF、JPEG、GIF、PNG等格式的圖像,?tesseract-ocr的最大特點是它是針對多語言設計的,可以識別世界上大部分語言的文本
    2024-04-04
  • 利用curl 多線程 模擬 并發(fā)的詳解

    利用curl 多線程 模擬 并發(fā)的詳解

    本篇文章是對利用curl多線程模擬并發(fā)進行了詳細的分析介紹,需要的朋友參考下
    2013-06-06
  • PHP+MYSQL 出現(xiàn)亂碼的解決方法

    PHP+MYSQL 出現(xiàn)亂碼的解決方法

    在之前的文章里,我已經(jīng)提過如何解決JSP中亂碼問題(解決tomcat下中文亂碼問題 ),其中也詳細解說了MYSQL亂碼問題,相信通過里面的辦法,
    2008-08-08
  • php分頁函數(shù)完整實例代碼

    php分頁函數(shù)完整實例代碼

    這篇文章主要介紹了php分頁函數(shù)完整實例代碼,采用較為詳盡的注釋說明了PHP分頁的方法及原理,需要的朋友可以參考下
    2014-09-09
  • 快速配置PHPMyAdmin方法

    快速配置PHPMyAdmin方法

    今天想提一下如何配置PHPMyAdmin,雖然在本機開發(fā)、調(diào)試系統(tǒng)時或許并不會用到它,但對于將來在遠程虛擬主機中放置Mysql數(shù)據(jù)庫時,必然會用到phpmyadmin這樣的Mysql GUI工具,所以,在本地先熟悉一下如何使用也是有必要的。
    2008-06-06
  • PHP對象克隆clone用法示例

    PHP對象克隆clone用法示例

    這篇文章主要介紹了PHP對象克隆clone用法,結合實例形式分析了php淺克隆與深克隆的相關概念、特點與實現(xiàn)方法,需要的朋友可以參考下
    2016-09-09
  • php ob_flush,flush在ie中緩沖無效的解決方法

    php ob_flush,flush在ie中緩沖無效的解決方法

    一些版本的 Microsoft Internet Explorer 只有當接受到的256個字節(jié)以后才開始顯示該頁面,所以必須發(fā)送一些額外的空格來讓這些瀏覽器顯示頁面內(nèi)容。
    2010-05-05
  • php常用字符串比較函數(shù)實例匯總

    php常用字符串比較函數(shù)實例匯總

    這篇文章主要介紹了php常用字符串比較函數(shù),實例匯總了substr_compare、strncasecmp、strncmp、strcoll等常用函數(shù),具有一定的參考借鑒價值,需要的朋友可以參考下
    2014-11-11

最新評論