关闭顶部展开顶部

谈php设计模式介绍——伪对象模式(7)_PHP教程

编辑Tag赚U币
教程Tag:暂无Tag,欢迎添加,赚取U币!

推荐:解析php字符串处理函数
addcslashes 为字符串里面的部分字符添加反斜线转义字符 addslashes 用指定的方式对字符串里面的字符进行转义 bin2hex 将二进制数据转换成十六进制表示 chr 返回一个字符的ASCII码 chunk_split 按一定的字符长度将字符串分割成小块 convert_cyr_string 将斯

下面是是一些帮助你认识测试功能的代码:

class PageDirector {

// ...

function run() {

$this->processLogin();

if ($this->isLoggedIn()) {

$this->showPage(

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

} else {

$this->showLogin();

}

$this->response->display();

}

function processLogin() {

if (array_key_exists(‘clear’, $_REQUEST)) {

$this->session->clear(‘user_name’);

$this->response->redirect(SELF);

}

}

}

最后是对登录表单的处理进行的测试。

class PageDirectorTestCase extends UnitTestCase {

// ...

function TestLoginFromRequest() {

$_REQUEST[‘name’] = ‘admin’;

$_REQUEST[‘passwd’] = ‘secret’;

$session =& new MockSession($this);

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

$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[‘name’]);

unset($_REQUEST[‘passwd’]);

}

}

如下是实现上面测试所要求特性的代码:


class PageDirector {

// ...

function processLogin() {

if (array_key_exists(‘clear’, $_REQUEST)) {

$this->session->clear(‘user_name’);

$this->response->redirect(SELF);

}

if (array_key_exists(‘name’, $_REQUEST)

&& array_key_exists(‘passwd’, $_REQUEST)

&& UserLogin::validate(

$_REQUEST[‘name’], $_REQUEST[‘passwd’])) {

$this->session->set(‘user_name’, $_REQUEST[‘name’]);

$this->response->redirect(SELF);

}

}

}

这段程序已经重构而且也有充分的测试,因此可以对其进行一些附加的重构来清除像主脚本访问Session类,查询不经UserLogin类认可的字段而去访问‘user_name’字段,及session被当成资源调用等的小毛病。

当$_REQUEST这个超级变量被封装为一个类似Session类的资源以便与伪对象的创建时,为何让代码访问它?这段 代码有很多问题:但它毕竟是某种人为的用来逐渐了解这些概念的例子,它是为此而被创造的所以你不必深究。

更为重要的是,你已经学会利用伪对象测试模式来分离代码,以及在测试中分离$_SESSION之类的资源和避免相互关联的对象(如包含在Response类中的exit())产生不希望的结果。

问题

使用伪对象来测试代码可以让你分离所开发的代码。你可以消除负面影响和潜在的问题,极大地减少你在整个测试工作中所花的时间。这是一个好消息,因为如果你花在测试上的时间越多,以后就会越省事,并且你也会希望测试不是只做一次,应该能够被重复进行。(译注:这句直译太别扭,所以加了些使其通顺的内容。)

在新重构的程序中仍然会有许多漏洞。比如$_REQUEST变量应该由一个类来封装以便于使用伪对象测试。又如 showLogin()方法的重新调用。再如所有那些addBody()方法的调用看起来是如此混乱。

这种编程风格的另一个缺点是你将无法使用任何所见即所得的HTML编辑工具,这是因为所有HTML代码都被包含在PHP的方法调用中了。为了避免这些限制,你可以加入一个简单的基于PHP的模板机制。你可以这样引入模板文件:

<form method=”post”>

Name:<input type=”text” name=”name”> Password:<input type=”password” name=”passwd”>

<input type=”submit” value=”Login”>

</form>

然后需要使用一个方法来调用它:

class Response {

// ...

/**

* adds a simple template mechanism to the response class

* @param string $template the path and name of the template file

* @return void

*/

function addBodyTemplate($template, $vars=array()) {

if (file_exists($template)) {

extract($vars);

ob_start();

include $template;

$this->_body .= ob_get_clean();

}

}

}

很明显的,世上没有最完美的模板引擎,但它确实使本章的示例代码精简整洁了。

在GoF中这种按任务进行分隔的概念是被鼓励的:

“分隔设计模式下对象被创建后,其子类的创建过程就可以不再关注了。”

如果你忠实地在测试中运用它的话,这句话能让你获益良多:你可以用内部Factory方法来代替伪对象所代表的类的实例。传统的测试模式所遵循的是子类化你的代码,然后重写对象的方法。Marcus Baker,SimpleTest的作者,为PHP创立了PartialMock技术,那是一种测试模式的捷径。 在其他的伪对象创建时你可以插入PartialMock。

如果你对理解如何在编程中使用伪对象有困难,请参见附录B关于Partial MockObject——SimpleTest Testing Practices的一节。

资源

有一些对你更好地了解PHP下伪对象模式有帮助的资源。你可以查看关于SimpleTest下伪对象的文档(参见http://simpletest.sf.net/SimpleTest/tutorial_MockObjects.pkg.html)。另外,Marcus Baker在2004年1月版的php|architect写了一篇文章题为“Testing Made Easy with Mock Objects”的文章。

分享:怎样把握技巧开发PHP网站
1.使用 ip2long() 和 long2ip() 函数来把 IP 地址转化成整型存储到数据库里。这种方法把存储空间降到了接近四分之一(char(15) 的 15 个字节对整形的 4 个字节),计算一个特定的地址是不是在一个区段内页更简单了,而且加快了搜索和排序的速度(虽然有时仅

共7页上一页1234567下一页
来源:模板无忧//所属分类:PHP教程/更新时间:2009-06-20
loading.. 评论加载中....
相关PHP教程
闂備焦鐪归崺鍕垂闁秵鍋ら柡鍥舵緛缂嶆牠鏌涢埄鍐姇闁抽攱甯楅妵鍕即濡も偓娴滄儳顪冮妶蹇曠Ф闁瑰嚖鎷�
婵犵數鍋涢顓熸叏椤撱垹纾婚柟鐐灱濡插牓鏌¢崒婵囩《濠⒀勭⊕娣囧﹪鎳犻澶嗗亾濠靛鐓熼柕蹇婃櫅閻忔煡鏌熼崙銈嗗
婵犵數濮烽。浠嬪焵椤掆偓閸熷潡鍩€椤掑嫷妫戠紒杈╁仜椤撳吋寰勭€n亝顓鹃柣搴f嚀鐎氼厽绔熼崱娆愬床濞戞柧绶氶弻锝夊閳轰胶浼堥梺鐟板殩閹凤拷
婵犵數濮烽。浠嬪焵椤掆偓閸熷潡鍩€椤掑嫷妫戠紒杈╁仜椤撳吋寰勬繝鍕靛悑闂備浇顕栭崹搴ㄥ礋椤撗勑氶梻浣筋嚙闁帮絽岣胯铻炴繛鎴欏灪閸嬪鏌ㄩ悤鍌涘
闂傚倷鑳舵灙缂佺粯鍔欓獮濠冩償閵娿儳鍔﹀銈嗗笒閸婂摜鏁崼鏇炵閻庢稒岣块惌鎺斺偓瑙勬礃缁诲牓寮幘缁樻櫢闁跨噦鎷�
闂傚倷鑳舵灙缂佺粯鍔欓獮濠冩償閵娿儳鍔﹀銈嗗坊閸嬫捇鏌涘顒夊剳缂侇喖锕弫鍌炲礈瑜忛悡鎾绘煟鎼搭垳宀涢柡鍛箞閹苯鈻庨幋鐘碉紳婵炴挻鑹鹃敃銉р偓姘炬嫹
闂傚倷娴囬妴鈧柛瀣尰閵囧嫰寮介妸褉妲堥梺浼欏瘜閸o綁寮诲☉妯锋斀闁归偊浜為懗铏圭磽娴i潧濡芥俊鐐舵椤曪綁濡搁埡濠冩櫖濠电偛妫欓崹鐢电箔閿熺姵鈷戦柛婵嗗閳ь剙顭烽獮濠囧箻閼告娼熼梺璺ㄥ櫐閹凤拷
闂傚倷绀侀幖顐﹀疮閻楀牊鍙忓瀣捣缁€濠傤熆閼搁潧濮堥柣鎿勭秮閹娼幏宀婂妳濠电偛鐪伴崐鏇㈡箒闂佹寧绻傚Λ娆戠矆閳ь剟姊洪崨濞氭垿鎮ч悩鑼殾闁规壆澧楅弲鎼佹煥閻曞倹瀚�
濠电姷顣藉Σ鍛村垂椤忓牆绀堟繝闈涙-閻斿棙淇婇姘倯閻庢氨绮妵鍕箻鐎靛摜鐣洪柣搴㈢啲閹凤拷
婵犵數濮烽。浠嬪焵椤掆偓閸熷潡鍩€椤掑嫷妫戠紒杈╁仜椤撳ジ宕堕妸銉紩婵$偑鍊栭幐鑽ゆ崲閸愵亖鍋撳铏彧濞e洤锕、娑樜旈埀顒佹櫠閸欏绡€妞ゎ偒鍠楃€氾拷
濠电姷顣藉Σ鍛村垂椤忓牆绀堟繝闈涙-閻斿棙鎱ㄥ璇蹭壕閻庤娲﹂崜鐔笺€佸▎鎾崇闁绘挸绨堕崑鎾绘偨閸涘﹦鍘搁梺鍓插亝缁诲嫬鐡┑鐘愁問閸n垶骞忛敓锟�
濠电姷顣藉Σ鍛村垂椤忓牆绀堟繝闈涙-閻斿棙鎱ㄥ璇蹭壕闂佸搫鑻幊姗€宕洪埀顒併亜閹哄棗浜鹃梺瀹狀嚙闁帮綁鐛幋锕€绠涢梻鍫熺⊕椤斿棝姊绘担鍛婃儓閻庢碍鎮傞獮蹇涙晸閿燂拷
濠电姷顣藉Σ鍛村垂椤忓牆绀堟繝闈涙-閻斿棙鎱ㄥ璇蹭壕閻庤娲╃紞渚€鐛€n亖鏀介柛顐亗缁憋拷
婵犵數濮烽。浠嬪焵椤掆偓閸熷潡鍩€椤掑嫷妫戠紒杈╁仜椤撳吋寰勬繝鍕幀闂備胶鎳撻悺銊ф崲閸曨垼鏁傞悗娑櫭肩换鍡樸亜閺嶎煈娈斿褍寮剁换婵嬶綖椤旇棄顏�
闂備浇顕ф鎼佸储濠婂牆绀堟繝闈涱儐閸嬪鏌熼幆鐗堫棄闁活厽顨呴埞鎴︽偐閹绘帗娈梺濂告涧缂嶅﹪寮婚妶澶嬪殟闁靛鍎遍~宥夋⒑缂佹ḿ澹勭紓宥勭閻e嘲鈻庨幘瀛樻闂佽法鍣﹂幏锟�
UB闂傚倷绀佸﹢杈╁垝椤栫偛绀夋俊銈呮噽瀹撲線鏌涢妷銏℃珕閻庢碍宀搁幃妤€鈽夊▍铏灴閿濈偤鏁撻敓锟�
闂傚倷娴囨竟鍫熴仈缁嬫娼栧┑鐘崇閻掗箖鎮楅悽鐢点€婇柛瀣崌閻涱噣宕归鍙ョ棯婵犵數濮崑鎾绘煥閻曞倹瀚�
闂備浇顕ф鍝ョ不瀹ュ鍨傞柛婵嗗閼板潡鏌涢姀銏犳
闂傚倷绀侀幉鈥愁潖缂佹ɑ鍙忓瀣捣缁€濠傤熆鐠鸿櫣鐏遍柛妤佺缁绘盯宕卞Δ鈧銏ゆ煕閻愬樊妲圭紒缁樼〒缁辨瑩鎮╅崫鍕腐闂備胶枪妤犲繘骞忛敓锟�
缂傚倸鍊搁崐鐑芥倿閿曞倹鍋¢柨鏇炲€搁崹鍌涚節婵犲倸顏い鈺呮敱閵囧嫰骞掑鍥舵М缂備焦褰冨﹢閬嶅焵椤掑倸浠柛濠冪箘缁辨挸顫濇0婵囨櫓闂佽法鍣﹂幏锟�
©2017 www.mb5u.com濠电姷顣藉Σ鍛村垂椤忓牆绀堟繝闈涙-閻斿棙鎱ㄥ璇蹭壕閻庢鍣崳锝夊箖閳哄懎绠甸柟鐑樻尭閻︼拷
闂傚倷娴囬妴鈧柛瀣崌閺岀喖顢涘⿰鍐炬毉濡炪們鍎婚幏锟�&闂傚倷绀侀幉锛勬暜閹烘嚦娑㈠籍閸噥妫呴梺璺ㄥ櫐閹凤拷