談php設(shè)計模式介紹——偽對象模式(4)_PHP教程
推薦:解析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)頁更簡單了,而且加快了搜索和排序的速度(雖然有時僅
- 相關(guān)鏈接:
- 教程說明:
PHP教程-談php設(shè)計模式介紹——偽對象模式(4)。