談php設(shè)計模式介紹——偽對象模式(4)_PHP教程

      編輯Tag賺U幣
      教程Tag:暫無Tag,歡迎添加,賺取U幣!

      推薦:解析php字符串處理函數(shù)
      addcslashes 為字符串里面的部分字符添加反斜線轉(zhuǎn)義字符 addslashes 用指定的方式對字符串里面的字符進行轉(zhuǎn)義 bin2hex 將二進制數(shù)據(jù)轉(zhuǎn)換成十六進制表示 chr 返回一個字符的ASCII碼 chunk_split 按一定的字符長度將字符串分割成小塊 convert_cyr_string 將斯

      更進一步說,你能隨心所欲的設(shè)置何種方法被調(diào)用以及調(diào)用多少次。你甚至可以驗證那些根本不該被調(diào)用的方法。

      下面是一個擴展型的測試,它用來建立和驗證那些復雜的設(shè)計。

      class PageDirectorTestCase extends UnitTestCase {

      function testSomethingWhichUsesSession() {

      $session =& new MockSession($this);

      $session->setReturnValue(‘isValid’, true);

      $session->setReturnValue(‘get’, 1);

      $session->expectOnce(‘isValid’, array(‘user_id’));

      $session->expectOnce(‘get’, array(‘user_id’));

      $session->expectNever(‘set’);

      // the actual code which uses $session

      $session->tally();

      }

      }

      使用偽對象的原因很多,方法也多樣化。但在我們繼續(xù)前,讓我們把另外的一些類加入進來,使其來龍去脈更加清楚。

      接下來的一部分是重構(gòu)已有腳本,創(chuàng)建一個用于檢查用戶是否有相應(yīng)權(quán)限的名為UserLogin的類。

      class UserLogin {

      var $_valid=true;

      var $_id;

      var $_name;

      function UserLogin($name) { switch (strtolower($name)) { case ‘admin’:

      $this->_id = 1;

      $this->_name = ‘admin’;

      break;

      default:

      trigger_error(“Bad user name ‘$name’”);

      $this->_valid=false;

      }

      }

      function name() {

      if ($this->_valid) return $this->_name;

      }

      function Validate($user_name, $password) {

      if (‘admin’ == strtolower($user_name)

      && ‘secret’ == $password) {

      return true;

      }

      return false;
      }
      }

      (在一個實際的程序中,你應(yīng)當按照如上所示的邏輯來查詢相應(yīng)的數(shù)據(jù)表,這種小而且編寫起來費神的類體現(xiàn)了你將如何運用ServerStub來組織代碼———ServerStub是一個小型的表達你想法的類,但它只是在一些限制環(huán)境下可用。)

      最后一部分是創(chuàng)建響應(yīng)。為了最終在瀏覽器中顯示,我們必須處理那不斷增長的HTML內(nèi)容,如果必要的話我們也會討論HTTP重定向。(你也可以執(zhí)行其他的http頭的操作——這樣說是為了能構(gòu)隱藏它——在一個成熟的做法中,但這里使用的是一段更簡單的代碼,是為了使例子容易理解與關(guān)注。)

      class Response {

      var $_head=’’;

      var $_body=’’;

      function addHead($content) {

      $this->_head .= $content;

      }

      function addBody($content) {

      $this->_body .= $content;

      }
      function display() {

      echo $this->fetch();

      }

      function fetch() {

      return ‘<html>’

      .’<head>’.$this->_head.’</head>’

      .’<body>’.$this->_body.’</body>’

      .’</html>’;

      }

      function redirect($url, $exit=true) {

      header(‘Location: ‘.$url);

      if ($exit) exit;

      }

      }

      給出了這些模塊后,也是時候?qū)⑦@些新開發(fā)的、已測試的組件聚合到一個頁面中了。讓我們寫一個最終的類來協(xié)調(diào)這個頁面的所以行為,取個合適的名字PageDirector。類PageDirector具有一個很簡單的運用程序接口:你在實例化后可以用調(diào)用它的run()方法。

      這個“bootstrap”文件運行新程序時應(yīng)如下所示:

      <?php

      require_once ‘classes.inc.php’;

      define(‘SELF’, ‘http://www.example.com/path/to/page.php’);

      $page =& new PageDirector(new Session, new Response);

      $page->run();

      ?>

      該文件包含了所需的已定義類,并為自己定義了一個常量,給PageDirector類(其用于傳遞類Session 和類Response所依賴的實例來組成構(gòu)造函數(shù))創(chuàng)建了一個實例來執(zhí)行PageDirector::run()方法。

      分享:怎樣把握技巧開發(fā)PHP網(wǎng)站
      1.使用 ip2long() 和 long2ip() 函數(shù)來把 IP 地址轉(zhuǎn)化成整型存儲到數(shù)據(jù)庫里。這種方法把存儲空間降到了接近四分之一(char(15) 的 15 個字節(jié)對整形的 4 個字節(jié)),計算一個特定的地址是不是在一個區(qū)段內(nèi)頁更簡單了,而且加快了搜索和排序的速度(雖然有時僅

      來源:模板無憂//所屬分類:PHP教程/更新時間:2009-06-20
      相關(guān)PHP教程