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

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

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

      下面的代碼段演示了緩存輸出被重構為runPage方法的結果,它給人的感覺就像是當用戶登錄時另一個對輸出的測試。

      class PageDirectorTestCase extends UnitTestCase {
      // ...
      function TestLoggedOutContent() {

      $session =& new MockSession($this);

      $session->setReturnValue(‘get’, null, array(‘user_name’));

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

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

      $result = $this->runPage($page);

      $this->assertNoUnwantedPattern(‘/secret.*content/i’, $result);

      $this->assertWantedPattern(‘/<form.*<input[^>]*text[^>]*’

      .’name.*<input[^>]*password[^>]*passwd/ims’

      ,$result);

      $session->tally();

      }

      function TestLoggedInContent() {

      $session =& new MockSession($this);

      $session->setReturnValue(‘get’, ‘admin’, array(‘user_name’));

      $session->expectAtLeastOnce(‘get’);

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

      $result = $this->runPage($page);

      $this->assertWantedPattern(‘/secret.*content/i’, $result);

      $this->assertNoUnwantedPattern(‘/<form.*<input[^>]*text[^>]*’

      .’name.*<input[^>]*password[^>]*passwd/ims’

      ,$result);

      $session->tally();

      }

      function runPage(&$page) {

      ob_start();

      $page->run();

      return ob_get_clean();

      }

      }

      接下來,將加入一個檢查條件到PageDirector::run()方法來看看用戶是否已經登錄并決定顯示什么模板:

      class PageDirector {

      // ...

      function run() {

      if ($this->isLoggedIn()) {

      $this->showPage(

      new UserLogin($this->session->get(‘user_name’)));

      } else {

      $this->showLogin();

      }

      $this->response->display();

      }

      function showPage(&$user) {

      $vars = array(

      ‘name’ => $user->name()

      ,’self’ => SELF

      );

      $this->response->addBodyTemplate(‘page.tpl’, $vars);

      }

      }

      page.tpl看上去可能像這樣:

      Welcome <?php echo $name; ?>
      <br>Super secret member only content here.
      <a href=”<?php echo $self; ?>?clear”>Logout</a>

      此時,MockSession扮演了ServerStub的角色來控制決定用戶是否登錄的條件。它的功能也類似評判者,決定這個信息是否通過如下兩個途徑被正確的使用:一個是明確地被預先定義并通過tally()被驗證,另一個是不直接的生成正確的輸出,而是通過ServerStub返回的值來生成。

      為了繼續重構這段代碼,下一步要跳到前面的進程。將要做兩個動作:清除已經登錄的用戶和驗證登錄頁面提交的用戶名和密碼是否存在。

      讓我們從注銷功能上開始:

      class PageDirectorTestCase extends UnitTestCase {

      // ...

      function TestClearLoginFunctionality() {

      $_REQUEST[‘clear’] = null;

      $session =& new MockSession($this);

      $session->expectOnce(‘clear’, array(‘user_name’));

      $session->setReturnValue(‘get’, null, array(‘user_name’));
      $session->expectAtLeastOnce(‘get’);

      $response = new MockResponse($this);

      $response->expectOnce(‘redirect’, array(SELF));

      $page =& new PageDirector($session, $response);

      $this->assertEqual(‘’, $this->runPage($page));
      $response->tally();

      $session->tally();

      unset($_REQUEST[‘clear’]);
      }

      }

      在這段代碼中,response是個偽對象,然而,一旦在Response::redirect()方法中調用了exit(),腳本將會停止執行。由于偽對象的存在,你可以核實方法是否被調用和方法傳回了什么參數,且不會產生任何負面影響——如腳本停止——或被實際執行。

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

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