中文字幕二区_国产精品免费在线观看_黄色网站观看_人人草人人澡_日本真实娇小xxxx

您的位置: 首頁 > 技術(shù)文檔 > 網(wǎng)絡(luò)編程 > php設(shè)計模式介紹之偽對象模式
php設(shè)計模式介紹之策略模式 回到列表 php設(shè)計模式介紹之注冊模式
 php設(shè)計模式介紹之偽對象模式

作者:wangyun522 時間: 2008-06-30 文檔類型:翻譯 來自:phpchina

第 1 頁 php設(shè)計模式介紹之偽對象模式 [1]
第 2 頁 php設(shè)計模式介紹之偽對象模式 [2]
第 3 頁 php設(shè)計模式介紹之偽對象模式 [3]
第 4 頁 php設(shè)計模式介紹之偽對象模式 [4]
第 5 頁 php設(shè)計模式介紹之偽對象模式 [5]
第 6 頁 php設(shè)計模式介紹之偽對象模式 [6]
第 7 頁 php設(shè)計模式介紹之偽對象模式 [7]

重構(gòu)已有程序

下面讓我們用偽對象來幫助重構(gòu)一個已有程序?紤]一個簡單的腳本,它可以模擬你在無數(shù)的PHP程序中所期望的行為:例如一個當(dāng)檢查到你未登錄時要求登錄的頁面;與此類似的還有表單處理頁面;它能在成功登錄后顯示不同內(nèi)容并提供登出的功能。 讓我們寫一個這樣的頁面。首先,對還未登錄的用戶顯示一個登錄表單。

<html>
<body>
<form method=”post”>
Name:<input type=”text” name=”name”> Password:<input type=”password” name=”passwd”>
<input type=”submit” value=”Login”>
</form>
</body>
</html>

接著,顯示登錄成功后的內(nèi)容:

<html>
<body>Welcome <?php echo $_SESSION[‘name’]; ?>
<br>Super secret member only content here.
<a href=”<?php echo SELF; ?>?clear”>Logout</a>
</body>
</html>

加入表單處理的功能,session(會話)開始,還有登出的功能,整體看起來應(yīng)該類似這樣:

session_start();
define(‘SELF’,
‘http://’.$_SERVER[‘SERVER_NAME’].$_SERVER[‘PHP_SELF’]);
if (array_key_exists(‘name’, $_REQUEST)
&& array_key_exists(‘passwd’, $_REQUEST)
&& ‘a(chǎn)dmin’ == $_REQUEST[‘name’]
&& ‘secret’ == $_REQUEST[‘passwd’]) {
$_SESSION[‘name’] = ‘a(chǎn)dmin’;
header(‘Location: ‘.SELF);
}
if (array_key_exists(‘clear’, $_REQUEST)) {
unset($_SESSION[‘name’]);
}
if (array_key_exists(‘name’, $_SESSION)
&& $_SESSION[‘name’]) { ?>
<html>
<body>Welcome <?=$_SESSION[‘name’]?>
<br>Super secret member only content here.
<a href=”<?php echo SELF; ?>?clear”>Logout</a>
</body>
</html> <?php
} else { ?>
<html>
<body>
<form method=”post”>
Name:<input type=”text” name=”name”> Password:<input type=”password” name=”passwd”>
<input type=”submit” value=”Login”>
</form>
</body>
</html> <?php
}

重構(gòu)這個程序的一個目的應(yīng)該是使其成為一個“易于測試”的程序;谶@個目的,如果你還選擇一些PHP中的方便特性——如超級全局變量——你將失去測試上的簡潔性。

例如,如果你直接就用了$_SESSION,即意味著只有一種途徑可以測試這個代碼,就是改變$_SESSION。如果你忘了將$_SESSION改回先前已知的狀態(tài),各種測試間就會互相干擾。

一個好的解決方法是封裝$_SESSION到另一個類中,傳遞所封裝類的實例到任何想要訪問$_SESSION的對象。如果你創(chuàng)建了一個已封裝對象的偽對象用于測試,你能夠完全控制對象對所調(diào)用方法的響應(yīng)(就像ServerStub那樣)并且你能核實它是如何調(diào)用的(那正是創(chuàng)建偽對象的目的)。

具備了這個思想,讓我們看看如何封裝$_SESSION之類的全局變量。

class Session {
function Session() {
$this->init();
}
function init() {
if (!isset($_SESSION)) {
if (headers_sent()) {
trigger_error(
‘Session not started before creating session object’);
} else {
session_start();
}
}
}
function isValid($key) {
return array_key_exists($key, $_SESSION);
}
function get($key) {
return (array_key_exists($key, $_SESSION))
? $_SESSION[$key]
: null;
}
function set($key, $value) {
$_SESSION[$key] = $value;
}
function clear($key) {
unset($_SESSION[$key]);
}
}

類Session封裝了全局變量$_SESSION。對類SESSION的測試非常類似于對前期的已注冊的類的改良測試(參見第5章),但是卻無任何通過參數(shù)獲得或設(shè)置相應(yīng)值的意圖。

你也許注意到了構(gòu)造函數(shù)調(diào)用了Session::init()方法。為什么這個方法不是構(gòu)造函數(shù)的一部分呢?這樣分開的好處是你能靜態(tài)調(diào)用它并確保session已經(jīng)開始。下面是一個如何使用該類的例子。

Session::init();
$page =& new PageDirector(new Session);

大部分測試方面的文獻很推崇偽對象并建議你親自寫一個。如果你打算那樣做,開始測試時你就只需要充實那些你需要的方法就可以了。譬如,一個用于處理代碼的ServerStub的Session類很可能是這樣的:

class MyMockSessionUser1 {
function isValid($key) {
return (‘user_id’ == $key) ? true : false;
}
function get($key) {
if (‘user_id’ == $key) {
return 1;
}
}
}

幸運的是,你可以用SimpleTest來避免那些易范的錯誤。Mock::generate()方法允許你創(chuàng)建一個類來實例化或動態(tài)地配置你想要的結(jié)果。

注:偽對象技術(shù)
SimpleTest所使用的方法僅是偽對象的多種用法之一。偽對象的代碼傳遞是另一種。隨著PHP5的到來,你也許能看到偽對象以對象中的__call()方法來執(zhí)行。
 

 以下是如何用SimpleTest生成的偽對象來測試并重構(gòu)MyMockSessionUser1類(如上例中)。

Mock::Generate(‘Session’);
class PageDirectorTestCase extends UnitTestCase {
function testSomethingWhichUsesSession() {
$session =& new MockSession($this);
$session->setReturnValue(‘isValid’, true);
$session->setReturnValue(‘get’, 1);
// ...
}
}

出處:phpchina
責(zé)任編輯:bluehearts

上一頁 php設(shè)計模式介紹之偽對象模式 [2] 下一頁 php設(shè)計模式介紹之偽對象模式 [4]

◎進入論壇網(wǎng)絡(luò)編程版塊參加討論

相關(guān)文章 更多相關(guān)鏈接
php設(shè)計模式介紹之策略模式
php設(shè)計模式介紹之注冊模式
php設(shè)計模式介紹之單件模式
flash+php+mysql簡單留言本教程
php設(shè)計模式介紹之工廠模式
關(guān)鍵字搜索 常規(guī)搜索 推薦文檔
熱門搜索:CSS Fireworks 設(shè)計比賽 網(wǎng)頁制作 web標(biāo)準(zhǔn) 用戶體驗 UE photoshop Dreamweaver Studio8 Flash 手繪 CG
站點最新 站點最新列表
周大福“敬•自然”設(shè)計大賽開啟
國際體驗設(shè)計大會7月將在京舉行
中國國防科技信息中心標(biāo)志征集
云計算如何讓安全問題可控
云計算是多數(shù)企業(yè)唯一擁抱互聯(lián)網(wǎng)的機會
阿里行云
云手機年終巨獻,送禮標(biāo)配299起
阿里巴巴CTO王堅的"云和互聯(lián)網(wǎng)觀"
1499元買真八核 云OS雙蛋大促
首屆COCO桌面手機主題設(shè)計大賽
欄目最新 欄目最新列表
淺談JavaScript編程語言的編碼規(guī)范
如何在illustrator中繪制臺歷
Ps簡單繪制一個可愛的鉛筆圖標(biāo)
數(shù)據(jù)同步算法研究
用ps作簡單的作品展示頁面
CSS定位機制之一:普通流
25個最佳最閃亮的Eclipse開發(fā)項目
Illustrator中制作針線縫制文字效果
Photoshop制作印刷凹凸字體
VS2010中創(chuàng)建自定義SQL Rule
>> 分頁 首頁 前頁 后頁 尾頁 頁次:3/71個記錄/頁 轉(zhuǎn)到 頁 共7個記錄

藍(lán)色理想版權(quán)申明:除部分特別聲明不要轉(zhuǎn)載,或者授權(quán)我站獨家播發(fā)的文章外,大家可以自由轉(zhuǎn)載我站點的原創(chuàng)文章,但原作者和來自我站的鏈接必須保留(非我站原創(chuàng)的,按照原來自一節(jié),自行鏈接)。文章版權(quán)歸我站和作者共有。

轉(zhuǎn)載要求:轉(zhuǎn)載之圖片、文件,鏈接請不要盜鏈到本站,且不準(zhǔn)打上各自站點的水印,亦不能抹去我站點水印。

特別注意:本站所提供的攝影照片,插畫,設(shè)計作品,如需使用,請與原作者聯(lián)系,版權(quán)歸原作者所有,文章若有侵犯作者版權(quán),請與我們聯(lián)系,我們將立即刪除修改。

您的評論
用戶名:  口令:
說明:輸入正確的用戶名和密碼才能參與評論。如果您不是本站會員,你可以注冊 為本站會員。
注意:文章中的鏈接、內(nèi)容等需要修改的錯誤,請用報告錯誤,以利文檔及時修改。
不評分 1 2 3 4 5
注意:請不要在評論中含與內(nèi)容無關(guān)的廣告鏈接,違者封ID
請您注意:
·不良評論請用報告管理員,以利管理員及時刪除。
·尊重網(wǎng)上道德,遵守中華人民共和國的各項有關(guān)法律法規(guī)
·承擔(dān)一切因您的行為而直接或間接導(dǎo)致的民事或刑事法律責(zé)任
·本站評論管理人員有權(quán)保留或刪除其管轄評論中的任意內(nèi)容
·您在本站發(fā)表的作品,本站有權(quán)在網(wǎng)站內(nèi)轉(zhuǎn)載或引用
·參與本評論即表明您已經(jīng)閱讀并接受上述條款
推薦文檔 | 打印文檔 | 評論文檔 | 報告錯誤  
專業(yè)書推薦 更多內(nèi)容
網(wǎng)站可用性測試及優(yōu)化指南
《寫給大家看的色彩書1》
《跟我去香港》
眾妙之門—網(wǎng)站UI 設(shè)計之道
《Flex 4.0 RIA開發(fā)寶典》
《贏在設(shè)計》
犀利開發(fā)—jQuery內(nèi)核詳解與實踐
作品集 更多內(nèi)容

雜⑦雜⑧ Gold NORMANA V2