<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
 <channel>
  <title>ThinkPHP | 开源PHP框架</title>
  <link>http://thinkphp.cn</link>
  <description><![CDATA[开源PHP框架]]></description>
  <generator>ThinkPHP RSS Generator </generator>
  <webMaster>liu21st@gmail.com</webMaster>
  <copyright>ThinkPHP 2009</copyright>
  <image>
   <url>http://thinkphp.cn/logo.png</url>
   <title>ThinkPHP</title>
   <link>http://thinkphp.cn</link>
  </image>
  <item>
   <title>上海顶想信息科技[ThinkPHP官方]诚聘</title>
   <description><![CDATA[<p>由于业务发展需要，ThinkPHP官方（上海顶想信息科技有限公司）现<span class="t_tag" onclick="tagshow(event)" href="tag.php?name=%E6%8B%9B%E8%81%98">招聘</span>人员如下：<br /><br/><br /><br/><span class="t_tag" onclick="tagshow(event)" href="tag.php?name=%E9%A1%B9%E7%9B%AE">项目</span>经理（1名）<br /><br/>1、5年以上实际WEB项目<span class="t_tag" onclick="tagshow(event)" href="tag.php?name=%E5%BC%80%E5%8F%91">开发</span>经验 精通<span class="t_tag" onclick="tagshow(event)" href="tag.php?name=PHP">PHP</span>等WEB开发语言<br /><br/>2、具有网站LAMP架构设计、部署和优化经验<br /><br/>3、有较强的分析问题和解决问题的能力<br /><br/>4、强烈的责任心，良好的沟通能力，良好的团队合作精神，对工作有激情<br /><br/>5、具备良好的<span class="t_tag" onclick="tagshow(event)" href="tag.php?name=%E4%BB%A3%E7%A0%81">代码</span>编程习惯及较强的文档编写能力<br /><br/>6、有大型网站开发经验或者团队管理经验者优先考虑<br /><br/>待遇范围：7000~10000<br /><br/><br /><br/>PHP<span class="t_tag" onclick="tagshow(event)" href="tag.php?name=%E7%A8%8B%E5%BA%8F%E5%91%98">程序员（3~5名）</span><br /><br/>1、2年以上WEB项目开发经验 良好的代码习惯和面向对象的编程思想<br /><br/>2、精通PHP，具备LAMP开发网站的经验<br /><br/>3、熟悉HTML/XHTML、CSS、Javascript<br /><br/>4、有良好的团队合作能力，善于沟通，热爱开发事业；<br /><br/>5、有责任心 具有良好的自学能力和独立解决问题的能力；<br /><br/>6、有自己的独立技术作品优先考虑<br /><br/>待遇范围：5000~7000<br /><br/><br /><br/>前端开发（1名）<br /><br/>1、2年以上前端开发经验<br /><br/>2、精通XHTML/CSS/JavaScript/<span class="t_tag" onclick="tagshow(event)" href="tag.php?name=Ajax">Ajax</span>/DOM 代码实现做到兼容主流浏览器<br /><br/>3、掌握Jquery或者任何一个JS<span class="t_tag" onclick="tagshow(event)" href="tag.php?name=%E6%A1%86%E6%9E%B6">框架</span> 熟悉YSlow和SEO知识<br /><br/>4、能够和美工很好的沟通衔接工作或者有一定的美工基础<br /><br/>5、熟悉Flash和ActionScript开发者优先考虑<br /><br/>待遇范围：3000~6000<br /><br/><br /><br/><span class="t_tag" onclick="tagshow(event)" href="tag.php?name=%E7%AE%80%E5%8E%86">简历</span>请投至<a href="mailto:hr@topthink.com">hr@topthink.com</a> 并附上个人作品和案例 合则约见<br /><br/><br /><br/>公司简介：<br /><br/>上海顶想信息科技有限公司（TOPThink Inc.）是国内领先的WEB<span class="t_tag" onclick="tagshow(event)" href="tag.php?name=%E5%BA%94%E7%94%A8">应用</span>和服务提供商，致力于WEB应用平台、产品和应用的研发和服务，为企事业单位提供基于WEB的应用开发快速解决<span class="t_tag" onclick="tagshow(event)" href="tag.php?name=%E6%96%B9%E6%A1%88">方案</span>和产品。公司成立于2008年，<span class="t_tag" onclick="tagshow(event)" href="tag.php?name=%E6%B3%A8%E5%86%8C">注册</span>资本100W，是一家拥有自主知识产权的高新企业。公司总部位于上海，由从事互联网和用户体验研究达10年的资深专家领军，拥有一批专业的策划、设计和技术团队以及广泛的社区技术力量。<br /><br/>公司由国内<span class="t_tag" onclick="tagshow(event)" href="tag.php?name=%E5%BC%80%E6%BA%90">开源</span>PHP框架ThinkPHP创始人刘晨于2008年创立，公司长期专注于WEB应用框架和解决方案的研究。ThinkPHP经过四年的精心打造和发展，具有广泛的用户基础和良好的业内口碑，拥有50w开发用户。已经成长为国内领先和最具影响力的WEB应用开发框架，其应用领域分布于各个行业，在企业WEB应用和<span class="t_tag" onclick="tagshow(event)" href="tag.php?name=%E7%94%B5%E5%AD%90%E5%95%86%E5%8A%A1">电子商务</span>方面有着非常良好支持以及拓展，大小案例不下千家，在安全、效率、负载上都有很大优势，已经成为WEB应用的快速开发解决方案和最佳实践！<br /><br/><br /><br/>公司理念：专业源于专注，细节决定成败。<br /><br/>我们的口号是：JUST THINK IT</p>]]></description>
   <link>http://thinkphp.cn/Blog/37</link>
   <pubDate>Thu, 07 Jan 2010 13:48:38 +0800</pubDate>
  </item>
  <item>
   <title>ThinkPHP新版壁纸系列</title>
   <description><![CDATA[<p>提供了三种颜色的新版壁纸，包括下面的尺寸大小：<br /><br/>1280&times;800&nbsp; &nbsp;&nbsp; &nbsp;1920&times;1200<br /><br/>1400&times;1050&nbsp; &nbsp;&nbsp;&nbsp;2560&times;1200<br /><br/>1440&times;900&nbsp; &nbsp;&nbsp; &nbsp;1280&times;1024<br /><br/>1680&times;1050&nbsp; &nbsp;&nbsp;&nbsp;1600&times;1200<br /><br/>1024&times;768&nbsp; &nbsp;&nbsp; &nbsp;1920&times;1440 <br /><br/>320&times;240&nbsp; &nbsp;&nbsp;&nbsp;240&times;320 <br /><br/>可以适合各种电脑和手机的分辨率。<br /><br/><span id="attach_1351" style="display: none; position: absolute" onmouseover="showMenu(this.id, 0, 1)"><img alt="" border="0" src="http://bbs.thinkphp.cn/images/default/attachimg.gif" /></span> <img class="" id="aimg_1351" alt="320&times;240.jpg" width="320" status="2" unselectable="true" h="240" w="320" outfunc="null" initialized="true" file="attachments/month_0910/0910021652f8322f1ba2ed2f72.jpg" x="397" y="593" onclick="zoom(this, this.src)" src="http://bbs.thinkphp.cn/attachments/month_0910/0910021652f8322f1ba2ed2f72.jpg" /> <span id="attach_1352" style="display: none; position: absolute" onmouseover="showMenu(this.id, 0, 1)"><img alt="" border="0" src="http://bbs.thinkphp.cn/images/default/attachimg.gif" /></span></p><br/><p>&nbsp;<img class="" id="aimg_1352" alt="320&times;240.jpg" width="320" status="2" unselectable="true" h="240" w="320" outfunc="null" initialized="true" file="attachments/month_0910/09100216526f06988fda111838.jpg" x="397" y="837" onclick="zoom(this, this.src)" src="http://bbs.thinkphp.cn/attachments/month_0910/09100216526f06988fda111838.jpg" /> <span id="attach_1353" style="display: none; position: absolute" onmouseover="showMenu(this.id, 0, 1)"><img alt="" border="0" src="http://bbs.thinkphp.cn/images/default/attachimg.gif" /></span></p><br/><p>&nbsp;<img id="aimg_1353" alt="320&times;240.jpg" width="320" status="2" file="attachments/month_0910/09100216523ede922e1fcb5ab3.jpg" onmouseover="showMenu(this.id, false, 2)" onclick="zoom(this, this.src)" src="http://bbs.thinkphp.cn/attachments/month_0910/09100216523ede922e1fcb5ab3.jpg" /> <br /><br/>由于壁纸较大，暂时提供1024*768尺寸的，其他的分辨率在官方新版套装的U盘里面提供~</p>]]></description>
   <link>http://thinkphp.cn/Blog/36</link>
   <pubDate>Fri, 02 Oct 2009 16:56:22 +0800</pubDate>
  </item>
  <item>
   <title>开沅软件携手ThinkPHP开源框架开展认证培训合作</title>
   <description><![CDATA[<p>北京时间2009年8月10日，上海顶想信息科技有限公司CEO、ThinkPHP开源企业级框架领导者刘晨与开沅系统软件（大连）有限公司创始人徐云雷在上海东怡大酒店签署协议。ThinkPHP企业级框架中国培训认证业务拉开序幕！！即日起，&ldquo;PHP企业级高端人才培养工程&rdquo;项目正式启动！！！<br /><br/>签约双方约定，以开沅软件研发的PHP开源技术社区&ldquo;PHP领地（PHP6D.COM）&rdquo;为平台，由ThinkPHP社区团队、开沅软件技术团队共同提供技术支持，面向全国推广PHP培训认证业务。<br /><br/>参训学员在获得企业级开发技术的同时，也将获得行业内权威的&ldquo;Zend PHPChina官方认证、ThinkPHP框架工程师认证、PHP领地高端项目实训认证、国家教育部证书。<br /><br/>ThinkPHP开源框架在企业级开发应用中，十分流行，深受企业青睐，面对严峻的就业形势，学员只有掌握了企业中正在应用的开发技术，才能够在职场中处于优越、领先的位置。 <br /><br/>开沅软件在PHP、Linux领域具有绝对的技术优势，旗下教育机构拥有PHP与Linux技术领域的权威课程体系与专家级别的师资力量、此次整合ThinkPHP开源框架，进一步奠定了开沅软件在国内PHP行业的领先地位。<br /><br/>&nbsp;此次培训业务合作的达成，是国内PHP领军企业的一次&ldquo;亲密接触&rdquo;。向国内众多的PHP爱好者传递着PHP在国内的企业级应用与发展即将进入到成熟阶段的信息。此次合作，在真正意义上实现了培养PHP企业级高端人才的愿望。</p><br/><p><img src="http://bbs.thinkphp.cn/attachments/month_0908/0908121057acd54e83d3b5cfbd.jpg" alt="" /></p><br/><p>ThinkPHP框架官方：<br /><br/>PHP作为互联网行业内排名第一的编程语言，在国内的发展迅速，为了满足企业级开发需求，ThinkPHP开源框架于2006年初诞生了。ThinkPHP是一个快速、兼容而且简单的轻量级PHP开发框架，其最大的特点是开源免费，并且能够解决应用开发中的绝大多数需要，近年来，获得了众多PHPer的支持与认可，并且拥有了众多的典型案例。发展至今，已经成为PHP企业级项目开发中不可缺少的利器！</p><br/><p>开沅软件背景介绍：<br /><br/>开沅软件成立于2006年，致力于开源软件产品研发与高端技术解决方案，旗下开沅教育机构率先在中国第一家引入Zend PHPChina专业培训课程。历经三载，先后与Zend PHPChina、全球最大的Linux厂商&mdash;红帽公司、ThinkPHP开源框架官方、香港即时科研集团达成战略合作，逐步树立并稳固了公司在PHP以及Linux的高端技术应用领域的主导地位。</p><br/><p>ThinkPHP官方社区：<a href="http://www.thinkphp.cn">www.thinkphp.cn</a><br /><br/>开沅软件（大连）高端项目实训中心&nbsp; 官方网站：<a href="http://www.carronedu.com">www.carronedu.com</a></p><br/><p>&nbsp;</p>]]></description>
   <link>http://thinkphp.cn/Blog/35</link>
   <pubDate>Wed, 12 Aug 2009 11:01:29 +0800</pubDate>
  </item>
  <item>
   <title>说说小故事</title>
   <description><![CDATA[<p>最近忙得焦头烂额的,也没多关注一些新的动态,想不到phpchina闹得很,看到一个老前辈和几个后辈闹得不可开交,呵呵,<br /><br/><br /><br/>不知这位前辈怎么想法了,如果是我我会觉得很丢人,无论什么情况下这都是减分的行为,呵呵<br /><br/><br /><br/>我很是感动,只有tper才说&quot;我们&quot;,而别人说的都是&quot;我&quot;,我想起了我之前在公司说过一句狠话:我不一定能把你怎么样,但我们绝对能把你搞死.呵呵,想想那帅的...后来,我们也真的拿了不少的第一,什么时候来说&quot;我们&quot;都会比&quot;我&quot;强...<br /><br/><br /><br/>不多说了,对于tper来说,我觉得我们能做的就是束已律人了,嘴巴在别人人身上就让他说个够吧,对于陪伴着tp成长、看着它一天天长大的人对tp的那份感情是别人无法理解的...<br /><br/><br /><br/>说说小故事吧:<br /><br/><strong>寒山问拾得曰：世间谤我、欺我、辱我、笑我、轻我、贱我、恶我、骗我、如何处治乎？  <br /><br/>拾得云：只是忍他、让他、由他、避他、耐他、敬他、不要理他、再待几年你且看他</strong>。<br /><br/><br /><br/>...........................</p>]]></description>
   <link>http://thinkphp.cn/Blog/34</link>
   <pubDate>Wed, 18 Feb 2009 00:59:06 +0800</pubDate>
  </item>
  <item>
   <title>庆祝TP发布三周年！</title>
   <description><![CDATA[<p>一转眼，ThinkPHP已经三岁啦！三年有太多的记忆，有太多的守候，有太多的支持，也有太多的鞭策！在此，感谢大家在过去的三年里，长期以来对ThinkPHP的关注和支持，并且对ThinkPHP无私的奉献，正是这些让ThinkPHP变得更好，变得更强大！ <br /><br/>在过去的2008年，到处都上演的奇迹，从汶川大地震，到奥运会胜利闭幕，再到金融危机，处处体现了中国人民的坚强毅力。ThinkPHP从一个简单的程序，发展到现在有近百个成功案例和几十万用户的框架，也希望能带给大家更多的奇迹，三年里，ThinkPHP凝结了太多人的心血和支持，发展到今天的1.5正式版，已经可以实现所有先流行的程序模式，不论是博客，论坛，商城，CMS，还是当下流行的SNS，ThinkPHP都有着成熟的案例和解决方案，而最新研发的Lite版本，更是在继续延续着TP一贯以来的创新和特色。在未来的日子里，希望ThinkPHP能给大家带来更多的奇迹，同时，ThinkPHP也希望能给大家，甚至整个互联网，带来更多的奇迹，还是那句老话，没有做不到，只有想不到，就让ThinkPHP带着大家乘坐梦想的航班，让您的梦想从此起航。</p>]]></description>
   <link>http://thinkphp.cn/Blog/33</link>
   <pubDate>Mon, 09 Feb 2009 10:31:21 +0800</pubDate>
  </item>
  <item>
   <title>祝tp生日快乐!</title>
   <description><![CDATA[<p>晚上睡不着,想起正是元宵节正是thinkphp三周年的生日,呵呵<br /><br/><br /><br/><strong><font color="#ff0000">祝tp生日快乐,及tp的父亲流年生日快乐!</font></strong><br /><br/><br /><br/>tp一路走来实属不容易,</p><br/><ul><br/>    <li>想起当初tp的前身FCS的故事....</li><br/>    <li>想起了流年一直为tp的开源默默奉献...</li><br/>    <li>想起了一路走来的一直陪伴着tp默默奉献的tper...自称tp小叔的yh,有着阳光笑容的td,冬瓜,塞北的雪,榴莲糖,东至........</li><br/>    <li>想起了tp给我带来的快乐.....</li><br/></ul><br/><p>感谢TP,感谢流年.<br /><br/>本来我是想送给tp一个小小的礼物,可是由于这些时间太忙,准备得还是不是充分,我总是不满意,还在修改中,现在看来是没办法及时送出了.<br /><br/><br /><br/><strong>礼物虽然会迟了,但礼物总会有的</strong>,在这是预先发布一下说明,我会慢慢的向着这个目标努力.<br /><br/><br /><br/><font color="#99cc00"><strong>Thinkmaker</strong></font><br /><br/><br /><br/>Thinkmaker是一款基于thinkphp的生成thinkphp程序的代码自动生成软件. thinkphp生成的代码基于thinkphp的面向对象思想及创新方法，结合了phpmaker的经典的理念和设计模式，融入了thinkphp众多的创新思想。主要实现:项目设置-&gt;建立数据库(或导入现有数据库)-&gt;生成配置(可略)-&gt;生成发布程序这个流程一条龙整合操作的代码生成器,程序是以代码模板的形式生成的,具有相当大的灵活性及可扩展性,使程序员可以节省大量机械录入的时间和重复劳动，而将精力集中于核心业务逻辑的开发及程序的总体二次开发应用中。Thinkmaker同时提供多项其他开发工作中常用到的辅助工具功能，您可以很方便轻松地进行thinkphp项目开发。让thinkphp开发变得轻松而快乐！<br /><br/><br /><br/>本系统开发已进入尾声,发布的日期视开发的进度而定,当我认为可以拿得出手的时候我自然会发布(坚持TP一贯的作风不玩跳票游戏),请耐心等待.</p>]]></description>
   <link>http://thinkphp.cn/Blog/32</link>
   <pubDate>Mon, 09 Feb 2009 03:12:09 +0800</pubDate>
  </item>
  <item>
   <title>lite版使用手记1-5</title>
   <description><![CDATA[<p>入门介绍，介绍了如何开始第一个lite项目</p><br/><p></p><br/><p>一、开始使用<br /><br/>ThinkPHP出了精简版，而且不管是自己的性能测试，还是流年的广告，或者最近的Svn更新，都意味着精简版在性能、可扩展性都有了很大程度的提高。关于TP精简版的一些介绍我就不多说了，仅仅把我在项目中使用精简版的一些经验，错误总结出来，做个记号，也方便自己将来查阅。</p><br/><p>虽然精简版还没有官方的文档，但是基本上和标准版的使用都是差不多的。</p><br/><p>（1）如何获得。<br /><br/>精简版是ThinkPHP SVN上的一个分支，SVN地址：<a href="http://thinkphp.googlecode.com/svn/branches/Lite/">http://thinkphp.googlecode.com/svn/branches/Lite/</a></p><br/><p>（2）如何安装。<br /><br/>精简版其实也可以理解为完整版（核心）的核心版本，并没有完整版自带的文档目录以及示例目录。</p><br/><p>因为流年发布精简版的初衷就假定使用者对TP比较熟悉。</p><br/><p>将下载下来的文件拷贝到任意有权限目录即可。</p><br/><p>（3）新建项目。<br /><br/>首先，需要配置项目的入口文件，这个入口文件的配置和标准版一模一样</p><br/><p>&nbsp;</p><br/><div class="codeText"><br/><div class="codeHead">PHP代码</div><br/><ol class="dp-c"><br/>    <li class="alt"><span><span><!--p   </sp--></span></span></li><br/>    <li class=""><span class="comment">//&nbsp;定义ThinkPHP框架路径 </span><span>&nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>define(</span><span class="string">'THINK_PATH'</span><span>,&nbsp;</span><span class="string">'../lite'</span><span>); &nbsp;&nbsp;</span></li><br/>    <li class=""><span class="comment">//定义项目名称和路径 </span><span>&nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>define(</span><span class="string">'APP_NAME'</span><span>,&nbsp;</span><span class="string">'test'</span><span>); &nbsp;&nbsp;</span></li><br/>    <li class=""><span>define(</span><span class="string">'APP_PATH'</span><span>,&nbsp;</span><span class="string">'.'</span><span>); &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span class="comment">//&nbsp;加载框架入口文件&nbsp; </span><span>&nbsp;&nbsp;</span></li><br/>    <li class=""><span class="keyword">require</span><span>(THINK_PATH.</span><span class="string">&quot;/ThinkPHP.php&quot;</span><span>); &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;</span></li><br/>    <li class=""><span class="comment">//实例化一个网站应用实例 </span><span>&nbsp;&nbsp;</span></li><br/>    <li class="alt"><span class="vars">$App</span><span>&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;App();&nbsp; &nbsp;&nbsp;</span></li><br/>    <li class=""><span class="comment">//应用程序初始化 </span><span>&nbsp;&nbsp;</span></li><br/>    <li class="alt"><span class="vars">$App</span><span>-&gt;run(); &nbsp;&nbsp;</span></li><br/>    <li class=""><span>?&gt;&nbsp;&nbsp;</span></li><br/></ol><br/></div><br/><p>上面写的很清楚了，就不再多说了，需要强调一点的是，由于精简版是性能至上，所以对任何损耗性能的地方我们都锱铢必较，在定义THINK_PATH时，我的例子写的是相对路径，如果你清楚绝对路径，那么强烈建议写成绝对路径，使性能有相应提高。</p><br/><p>入口文件写好之后我们使用浏览器访问<a href="http://localhost/test/">http://localhost/test/</a>，和标准版一样，会出现一行文字&ldquo;^_^ Hello,欢迎使用ThinkPHP&rdquo;，没错，即使是精简版，TP也是提供项目路径自动生成的，不用自己手动生成路径。</p><br/><p>这样，我们的精简项目就初始化完毕了。</p><br/><p>（4）配置介绍<br /><br/>由于TP的配置思想，其本身有一个惯例配置文件，在lite（我开发环境的精简版文件夹名称，下同）/Common/convention.php这个文件。</p><br/><p>可以看到，这个文件返回了一个惯例配置的数组，下面简单说一下里面比较重要的几个配置。</p><br/><p>'DISPATCH_ON'dispatch直接翻译过来是调度器，这个配置是让用户选择是否使用TP的调度功能。所谓调度功能，就是TP可以根据URL后边的信息，实现一个类似用户动作（Action）路由的功能，从而实现简洁美观的URL地址。那么，什么时候打开，什么时候关闭呢？这个我们后边会讲到，不过先简单的提一下，如果你一定要使用类似index.php/m/module/a/action/id/1这样的功能，那么就必须设置'DISPATCH_ON'=&gt;true，如果按照默认，就只能用index.php?m=module&amp;a=action这样了。</p><br/><p>'URL_MODEL'，这个为URL模式，0 普通模式 1 PATHINFO 2 REWRITE 3 兼容模式 当DISPATCH_ON开启后有效</p><br/><p>'PATH_MODEL'，如果URL_MODEL设置为1，那么这个设置就是指定用户希望使用什么样的URL形式访问页面，通常这个值可以设置为1、2、3三种。<br /><br/>1为普通模式，需要使用参数没有顺序/m/module/a/action/id/1<br /><br/>2为智能模式，自动识别模块和操作/module/action/id/1/ 或者 /module,action,id,1/...<br /><br/>3为兼容模式，通过一个GET变量将PATHINFO传递给dispather，默认为s index.php?s=/module/action/id/1<br /><br/>更多的是使用智能模式，这样的URL简洁明快而且好看，不过，如果使用Pathinfo构造网站，会或多或少造成一定的性能损耗，因为每访问一次页面都要有一次解析的URL的过程。</p><br/><p>'PATH_DEPR'，这个设置是说明，用户想通过什么符号隔开我们的URL呢？最普通的就是用&ldquo;/&rdquo;这样类似目录的访问，不过，如果你设置成&ldquo;,&rdquo;，那么你的URL路径就是/module,action,id,1/这样，呵呵。</p><br/><p>'ROUTER_ON'，这个设置是是否开启URL路由功能，这个路由是这样的，举个例子，很多博客的URL都类似于url.com/blog/1这样，直接能看出来是访问的是blog的第一篇文章，但是，这并不符合我们TP的URL规范，其实这就是开启了路由功能，我们写了一个文件conf/routes.php这个配置文件，配置只要访问blog，就是访问blogAction下的readBlog方法，并且传递id这个参数给这个方法。具体怎么定义详细的路由规则，请参见<a href="http://www.thinkphp.cn/Manual/212">http://www.thinkphp.cn/Manual/212</a></p><br/><p>'CHECK_FILE_CASE'，是否检查文件的大小写，本来这个不想多说，但是看到有部分同学在这里出现了问题，还是提示一下。在标准版里，这个默认是打开的，所以不管是Windows还是Linux，都是检查文件大小写的，不过在精简版里这个是关闭的。</p><br/><p>'BEHAVIOR_ON'，是否开启行为模式。呵呵，不要被老大的名词搞晕，行为模式替代了标准版里的插件，同样实现了比较灵活的类似插件的机制。这个我们之后从理论联系实际慢慢说，如果心急的朋友可以看TP更新说明<a href="http://www.thinkphp.cn/Change/252">http://www.thinkphp.cn/Change/252</a></p><br/><p>'THIN_MODEL'，简洁模式，如果用户希望加载最少的类库从而达到最高的速度，那么简洁模式是你的不二之选，不过，不要以为简洁模式就是速度的救命稻草，虽然简洁模式是所有框架的所有模式中最快的，但是和其他一些功能不全但号称速度很快的框架一样，简洁模式加载的最少的类库，甚至不能使用View类的所有方法（因为没有加载View类）包括display,assign等等常用方法。当然，没有加载不意味着就不能用了，我们以后会接着讲若简洁模式没给我们加载，我们怎么才能自己加载。</p><br/><p>'DEBUG_MODE'，调试模式，如果开启调试模式，最明显的就是在页面最下方显示页面调试信息，而且，不生成框架和项目缓存，方便开发调试。</p><br/><p>'TMPL_CACHE_ON'是否开始模板缓存，很多初学者（包括我）都为之头疼的一个问题，就是TP会自动缓存模板，这样如果修改模板，就不能及时显示出来，所以我们在开发时设置此项为false，我们的任何更改就都立竿见影了（包括include的其他Action）。</p><br/><p>个人认为在精简版配置里需要强调的也就这么多了，如果想跟深入的了解精简版的配置文件，那么就自己查看convention.php文件吧，注释非常详细，你定会大有收获。</p><br/><p>（5）写一个自己的方法<br /><br/>打开我们的\test\Lib\Action\IndexAction.class.php文件，发现这个文件是TP自己给我们生成的，里面有一个index方法。<br /><br/>我们模仿这个例子，自己写一个myHello()</p><br/><p>&nbsp;</p><br/><div class="codeText"><br/><div class="codeHead">PHP代码</div><br/><ol class="dp-c"><br/>    <li class="alt"><span><span><!--p   </sp--></span></span><span>; &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">function</span><span>&nbsp;myHello() &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="func">echo</span><span>&nbsp;(</span><span class="string">&quot;hello&nbsp;world&quot;</span><span>); &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li><br/>    <li class=""><span>} &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>?&gt;&nbsp;&nbsp;</span><br/>    <div>&nbsp;</div><br/>    <p>然后访问：<a href="http://localhost/test/index.php?m=Index&amp;a=myHello">http://localhost/test/index.php?m=Index&amp;a=myHello</a><br /><br/>    就会显示出来一行字hello world。我们分析一下这个URL，m后边跟的是Index就是我们的类名，a后边跟的是myHello就是我们的方法名，那么类似，如果我们访问<a href="http://localhost/test/index.php?m=Index&amp;a=index">http://localhost/test/index.php?m=Index&amp;a=index</a> 是不是如愿以偿的访问到了最初初始化的那个页面呢？<br /><br/>    可以看到，在这里，我们的使用方法和标准版都是一样的，接下来，我们一个一个看看TP的特色之一：单字母函数。</p><br/>    </li><br/>    <li class=""><span class="comment">//&nbsp;本类由系统自动生成，仅供测试用途 </span><span>&nbsp;&nbsp;</span></li><br/>    <li class="alt"><span class="keyword">class</span><span>&nbsp;IndexAction&nbsp;</span><span class="keyword">extends</span><span>&nbsp;Action{ &nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">function</span><span>&nbsp;index(){ &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;header(</span><span class="string">&quot;Content-Type:text/html;&nbsp;charset=utf-8&quot;</span><span>); &nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="func">echo</span><span>&nbsp;</span><span class="string">&quot;</span></li><br/></ol><br/></div><br/><p>&quot;</p>]]></description>
   <link>http://thinkphp.cn/Blog/31</link>
   <pubDate>Tue, 03 Feb 2009 20:47:20 +0800</pubDate>
  </item>
  <item>
   <title>祝大家新年快乐！[新年壁纸下载]</title>
   <description><![CDATA[<p><strong><font color="#ff0000">值此新春之际，ThinkPHP恭祝大家新年快乐，新的一年牛气冲天！用了TP开发工作不用再愁^_^</font></strong></p><br/><p>特别送上新年的TP壁纸，包含红色主题和黄色主题两种风格，依旧提供不同分辨率的版本下载，也包括手机壁纸。<br /><br/><img alt="" src="http://thinkphp.cn/Public/Uploads/497b15f870e72.jpg" /><br /><br/><br /><br/><img alt="" src="http://thinkphp.cn/Public/Uploads/497b15f86fed5.jpg" /><br /><br/>下载：[ <a href="http://thinkphp.cn/Down/download/id/108">新年红色主题壁纸</a> <a href="http://thinkphp.cn/Down/download/id/109">新年黄色主题壁纸</a> ]</p>]]></description>
   <link>http://thinkphp.cn/Blog/29</link>
   <pubDate>Sat, 24 Jan 2009 21:22:13 +0800</pubDate>
  </item>
  <item>
   <title>用最简单的tp方法,备份当前项目数据库的所有内容</title>
   <description><![CDATA[<div class="codeText"><br/><div class="codeHead">PHP代码</div><br/><ol class="dp-xml" start="1"><br/>    <li class="alt"><span><span>import(&quot;Think.Db.Db&quot;);&nbsp;&nbsp;//D('');也可以&nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>$<span class="attribute">db</span><span>&nbsp;=&nbsp;&nbsp;&nbsp;</span><span class="attribute-value">DB</span><span>::getInstance();&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span>$<span class="attribute">tables</span><span>&nbsp;=&nbsp;$db-</span><span class="tag">&gt;</span><span>getTables();&nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>foreach&nbsp;($tables&nbsp;as&nbsp;$tbname){&nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;$<span class="attribute">coumt</span><span>=$db-</span><span class="tag">&gt;</span><span>getFields($tbname);&nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;$<span class="attribute">modelname</span><span>=</span><span class="attribute-value">str_replace</span><span>(C('DB_PREFIX'),'',$tbname);&nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;$<span class="attribute">row</span><span>=</span><span class="attribute-value">D</span><span>($modelname);&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;$<span class="attribute">row</span><span>=$row-</span><span class="tag">&gt;</span><span>findAll();&nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;$<span class="attribute">values</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">array</span><span>();&nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;foreach&nbsp;($row&nbsp;as&nbsp;$value)&nbsp;{&nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$<span class="attribute">sql</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">&quot;INSERT&nbsp;INTO&nbsp;`{$tbname}`&nbsp;VALUES&nbsp;(&quot;</span><span>;&nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach($value&nbsp;as&nbsp;$v)&nbsp;{&nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $sql&nbsp;<span class="attribute">.</span><span>=</span><span class="attribute-value">&quot;'&quot;</span><span>.mysql_real_escape_string($v).&quot;',&quot;;&nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$<span class="attribute">sql</span><span>=</span><span class="attribute-value">substr</span><span>($sql,0,-1);&nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$sql&nbsp;<span class="attribute">.</span><span>=&nbsp;</span><span class="attribute-value">&quot;);\n&quot;</span><span>;&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;$<span class="attribute">tempsql.</span><span>=&nbsp;$sql;&nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;$<span class="attribute">sql</span><span>=</span><span class="attribute-value">''</span><span>;&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><br/>    <li class=""><span>}&nbsp; <br /><br/>    </span></li><br/>    <li class=""><span>echo </span><span>$<span class="attribute">tempsql</span></span><span><span>;</span></span></li><br/></ol><br/></div><br/><p>当然,这个方法不完美,远不及phpmyadmin强大,如果只想简单备份一下当前运行项目的数据库内容,想想也不见得需要phpmyadmin,自己动手丰衣足食!</p><br/><p>&nbsp;</p><br/><p>呵呵,具有纯种的thinkphp血统!</p><br/><p>&nbsp;</p><br/><p>&nbsp;</p>]]></description>
   <link>http://thinkphp.cn/Blog/28</link>
   <pubDate>Tue, 20 Jan 2009 14:50:10 +0800</pubDate>
  </item>
  <item>
   <title>网页中的字符串的处理[输出篇]</title>
   <description><![CDATA[<p>ThinkPHP中的字符串的处理[输入篇]介绍了ThinkPHP的输入注意的事项，下面，我们介绍输出。</p><br/><p>仍旧使用上次插入的数据。</p><br/><div class="codeText"><br/><div class="codeHead">PHP代码</div><br/><ol class="dp-c"><br/>    <li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">function</span><span>&nbsp;show() &nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>{ &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$model</span><span>&nbsp;=&nbsp;D(</span><span class="string">'test'</span><span>); &nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$data</span><span>&nbsp;=&nbsp;</span><span class="vars">$model</span><span>-&gt;find(2); &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;dump(</span><span class="vars">$data</span><span>); &nbsp;&nbsp;</span></li><br/>    <li class=""><span>}&nbsp;&nbsp;</span></li><br/></ol><br/></div><br/><p><br /><br/>输出结果：</p><br/><div class="codeText"><br/><div class="codeHead">XML/HTML代码</div><br/><ol class="dp-xml"><br/>    <li class="alt"><span><span>array(3)&nbsp;{ &nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>&nbsp;&nbsp;[&quot;id&quot;]&nbsp;=</span><span class="tag">&gt;</span><span>&nbsp;string(1)&nbsp;&quot;2&quot; &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;[&quot;title&quot;]&nbsp;=</span><span class="tag">&gt;</span><span>&nbsp;string(15)&nbsp;&quot;ThinkPHP's&nbsp;Code&quot; &nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;[&quot;content&quot;]&nbsp;=</span><span class="tag">&gt;</span><span>&nbsp;string(66)&nbsp;&quot;I&nbsp;like&nbsp;ThinkPHP. &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span class="tag">&lt;</span><span class="tag-name">b</span><span class="tag">&gt;</span><span>me&nbsp;too!</span><span class="tag"><span class="tag-name">b</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li><br/>    <li class=""><span>it's&nbsp;good!&quot; &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>}&nbsp;&nbsp;</span></li><br/></ol><br/></div><br/><p>下面把代码修改为：</p><br/><div class="codeText"><br/><div class="codeHead">PHP代码</div><br/><ol class="dp-c"><br/>    <li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">function</span><span>&nbsp;show() &nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>{ &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$model</span><span>&nbsp;=&nbsp;D(</span><span class="string">'test'</span><span>); &nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$data</span><span>&nbsp;=&nbsp;</span><span class="vars">$model</span><span>-&gt;find(2); &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="func">echo</span><span>&nbsp;</span><span class="string">'$data</span><span>[</span><span class="string">'title'</span><span>].</span><span class="string">'&quot;&gt;'</span><span>.</span><span class="vars">$data</span><span>[</span><span class="string">'title'</span><span>].</span><span class="string">''</span><span>; &nbsp;&nbsp;</span></li><br/>    <li class=""><span>}&nbsp;&nbsp;</span></li><br/></ol><br/></div><br/><p>&nbsp;&nbsp;&nbsp;&nbsp;<br /><br/>&nbsp; 结果出来一个正确的超链接。<br /><br/>&nbsp; 但是，在实际情况中，html标签的属性值有可能是单引号，所以为了适应所有的情况，我们使用Input::forTag();&nbsp;&nbsp;&nbsp;</p><br/><div class="codeText"><br/><div class="codeHead">PHP代码</div><br/><ol class="dp-c"><br/>    <li class="alt"><span><span class="func">echo</span><span>&nbsp;</span><span class="string">'$data</span><span>[</span><span class="string">'title'</span><span>]).</span><span class="string">'&quot;&gt;'</span><span>.</span><span class="vars">$data</span><span>[</span><span class="string">'title'</span><span>].</span><span class="string">''</span><span>;&nbsp;&nbsp;</span></span></li><br/></ol><br/></div><br/><p><br /><br/>&nbsp; 输出的html代码将是：<a title="ThinkPHP's Code" href="#">ThinkPHP's Code</a><br /><br/>同样，如果这个标题ThinkPHP's Code，更改成 &quot;论Html中的&quot;（不包括引号），连接就会不正常了。<br /><br/>&nbsp;所以，对于纯文本形式的输出，我们需要使用：Input::forShow();</p><br/><div class="codeText"><br/><div class="codeHead">PHP代码</div><br/><ol class="dp-c"><br/>    <li class="alt"><span><span class="func">echo</span><span>&nbsp;</span><span class="string">'$data</span><span>[</span><span class="string">'title'</span><span>]).</span><span class="string">'&quot;&gt;'</span><span>.Input::forShow(</span><span class="string">'论Html中的'</span><span>).</span><span class="string">''</span><span>;&nbsp;&nbsp;</span></span></li><br/></ol><br/></div><br/><p><br /><br/>&nbsp;输出的html代码是：&nbsp;</p><br/><div class="codeText"><br/><div class="codeHead">XML/HTML代码</div><br/><ol class="dp-xml"><br/>    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">a</span><span>&nbsp;</span><span class="attribute">href</span><span>=</span><span class="attribute-value">&quot;#&quot;</span><span>&nbsp;</span><span class="attribute">title</span><span>=</span><span class="attribute-value">&quot;ThinkPHP's&nbsp;Code&quot;</span><span class="tag">&gt;</span><span>论Html中的</span><span class="tag">&lt;</span><span class="tag-name">a</span><span class="tag">&gt;</span><span class="tag"><span class="tag-name">a</span><span class="tag">&gt;</span><span class="tag"><span class="tag-name">a</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span> </span></span></li><br/></ol><br/></div><br/><p>&nbsp; 对于多行文本，我们再试一下：&nbsp;&nbsp;</p><br/><div class="codeText"><br/><div class="codeHead">PHP代码</div><br/><ol class="dp-c"><br/>    <li class="alt"><span><span class="func">echo</span><span>&nbsp;</span><span class="string">'$data</span><span>[</span><span class="string">'title'</span><span>]).</span><span class="string">'&quot;&gt;'</span><span>.Input::forShow(</span><span class="vars">$data</span><span>[</span><span class="string">'content'</span><span>]).</span><span class="string">''</span><span>;&nbsp;&nbsp;</span></span></li><br/></ol><br/></div><br/><p><br /><br/>&nbsp; 得到的html代码是：</p><br/><div class="codeText"><br/><div class="codeHead">XML/HTML代码</div><br/><ol class="dp-xml"><br/>    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">a</span><span>&nbsp;</span><span class="attribute">href</span><span>=</span><span class="attribute-value">&quot;#&quot;</span><span>&nbsp;</span><span class="attribute">title</span><span>=</span><span class="attribute-value">&quot;ThinkPHP's&nbsp;Code&quot;</span><span class="tag">&gt;</span><span>I&nbsp;like&nbsp;ThinkPHP.</span><span class="tag">&lt;</span><span class="tag-name">br</span><span>&nbsp;</span><span class="tag">/&gt;</span><span class="tag">&lt;</span><span class="tag-name">b</span><span class="tag">&gt;</span><span>me&nbsp;too!</span><span class="tag"><span class="tag-name">b</span><span class="tag">&gt;</span><span class="tag">&lt;</span><span class="tag-name">br</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>it's&nbsp;good!</span><span class="tag"><span class="tag-name">a</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span> </span></span></li><br/></ol><br/></div><br/><p><br /><br/>&nbsp;在浏览器中，保持了原来的换行的格式。<br /><br/>&nbsp;<br /><br/>&nbsp;数据有输入就有编辑：<br /><br/>&nbsp;在纯文本的编辑中：</p><br/><p><font color="#3366ff">echo '&lt;textarea&gt;'.Input::forTarea($data['content']).'&lt;/textarea&gt;';</font></p><br/><p>&nbsp;得到的就是在输入的时候同样的格式，forTarea，就是专门在&lt;textarea&gt;中显示数据用的。<br /><br/>&nbsp;<br /><br/>&nbsp;而单行纯文本的编辑，是在&lt;input value=&quot;数据&quot; /&gt; 进行的，所以使用forTag就可以了。<br /><br/>&nbsp;<br /><br/>&nbsp;下面看看可视化编辑器吧。FCKeditor是这个样子<br /><br/><font color="#3366ff">&nbsp;&lt;textarea type=&quot;hidden&quot; id=&quot;FCKeditor&quot; name=&quot;FCKeditor&quot; style=&quot;display:none&quot; &gt;数据&lt;/textarea&gt;&lt;input type=&quot;hidden&quot; id=&quot;FCKeditor___Config&quot; value=&quot;&quot; style=&quot;display:none&quot; /&gt;&lt;iframe id=&quot;FCKeditor___Frame&quot; src=&quot;FCKeditor/editor/fckeditor.html?InstanceName=FCKeditor&amp;amp;Toolbar=Default&quot; width=&quot;100%&quot; height=&quot;500&quot; frameborder=&quot;0&quot; scrolling=&quot;no&quot;&gt;&lt;/iframe&gt;<br /><br/></font>&nbsp;也就是说，需要编辑的数据是在textarea标签的内部。经过测试，只需要进行forTarea就可以了。从前我记得FCKeditor编辑器是使用input的，对于这种编辑器，forTag就可以解决问题。<br /><br/>&nbsp;<br /><br/>&nbsp;我们总结一下，ThinkPHP输出数据的时候的原则：<br /><br/>&nbsp;* 页面显示：<br /><br/>&nbsp;*&nbsp;&nbsp;&nbsp; 纯文本方式显示在网页中，如文章标题&lt;title&gt;$data&lt;/title&gt;： $data = Input::forShow($field);<br /><br/>&nbsp;*&nbsp;&nbsp;&nbsp; HTML 在网页中显示，如文章内容：无需处理。<br /><br/>&nbsp;*&nbsp;&nbsp;&nbsp; 在网页中以源代码方式显示html,也属于纯文本方式显示：$vo = Input::forShow($html);<br /><br/>&nbsp;*&nbsp;&nbsp;&nbsp; 纯文本或者HTML在textarea中进行编辑: $vo = Input::forTarea($value);<br /><br/>&nbsp;*&nbsp;&nbsp;&nbsp; html在标签中使用，如&lt;input value=&quot;数据&quot; /&gt; ，使用 $vo = Input::forTag($value); 或者 $vo = Input::hsc($value);<br /><br/>&nbsp;* <br /><br/>&nbsp;*&nbsp;&nbsp;&nbsp; 以上，你只需要记住forTarea,forTag就可以了。其他情况，只要纯文本显示，就是forShow，使用html无需处理。<br /><br/>&nbsp;。<br /><br/>&nbsp;<br /><br/>&nbsp;最后说说一个特殊情况，在mysql的搜索中，%和_是特殊的字符，%代表任意字符，_代表一个字符。<br /><br/>&nbsp;<br /><br/>&nbsp;如果一个标题是 %abc%efg 的话，应该使用\%abc\%efg来搜索。<br /><br/>&nbsp;<br /><br/>&nbsp;不然 %abc%efg就会搜索出来 类似 SDR3432abc24323efg这种。<br /><br/>&nbsp;<br /><br/>&nbsp;下面看看代码：</p><br/><div class="codeText"><br/><div class="codeHead">PHP代码</div><br/><ol class="dp-c"><br/>    <li class="alt"><span><span>import(</span><span class="string">'ORG.Util.HashMap'</span><span>);&nbsp; &nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>import(</span><span class="string">'ORG.Util.HashMap'</span><span>); &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span class="vars">$map</span><span>&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;HashMap(); &nbsp;&nbsp;</span></li><br/>    <li class=""><span class="vars">$model</span><span>&nbsp;=&nbsp;D(</span><span class="string">'test'</span><span>); &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span class="vars">$map</span><span>-&gt;put(</span><span class="string">'title'</span><span>,</span><span class="keyword">array</span><span>(</span><span class="string">'like'</span><span>,</span><span class="string">'%abc%efg'</span><span>)); &nbsp;&nbsp;</span></li><br/>    <li class=""><span class="vars">$data</span><span>&nbsp;=&nbsp;</span><span class="vars">$model</span><span>-&gt;findAll(</span><span class="vars">$map</span><span>); &nbsp;&nbsp;</span></li><br/></ol><br/></div><br/><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br/>&nbsp; 看看搜索结果：</p><br/><div class="codeText"><br/><div class="codeHead">XML/HTML代码</div><br/><ol class="dp-xml"><br/>    <li class="alt"><span><span>array(2)&nbsp;{ &nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>&nbsp;&nbsp;[0]&nbsp;=</span><span class="tag">&gt;</span><span>&nbsp;array(3)&nbsp;{ &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;[&quot;id&quot;]&nbsp;=</span><span class="tag">&gt;</span><span>&nbsp;string(1)&nbsp;&quot;9&quot; &nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;[&quot;title&quot;]&nbsp;=</span><span class="tag">&gt;</span><span>&nbsp;string(8)&nbsp;&quot;%abc%efg&quot; &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;[&quot;content&quot;]&nbsp;=</span><span class="tag">&gt;</span><span>&nbsp;string(66)&nbsp;&quot;I&nbsp;like&nbsp;ThinkPHP. &nbsp;&nbsp;</span></li><br/>    <li class=""><span class="tag">&lt;</span><span class="tag-name">b</span><span class="tag">&gt;</span><span>me&nbsp;too!</span><span class="tag">&lt;/</span><span class="tag-name">b</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>it's&nbsp;good!&quot; &nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;} &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;[1]&nbsp;=</span><span class="tag">&gt;</span><span>&nbsp;array(3)&nbsp;{ &nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;[&quot;id&quot;]&nbsp;=</span><span class="tag">&gt;</span><span>&nbsp;string(2)&nbsp;&quot;10&quot; &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;[&quot;title&quot;]&nbsp;=</span><span class="tag">&gt;</span><span>&nbsp;string(18)&nbsp;&quot;SDR3432abc24323efg&quot; &nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;[&quot;content&quot;]&nbsp;=</span><span class="tag">&gt;</span><span>&nbsp;string(66)&nbsp;&quot;I&nbsp;like&nbsp;ThinkPHP. &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span class="tag">&lt;</span><span class="tag-name">b</span><span class="tag">&gt;</span><span>me&nbsp;too!</span><span class="tag">&lt;/</span><span class="tag-name">b</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li><br/>    <li class=""><span>it's&nbsp;good!&quot; &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;} &nbsp;&nbsp;</span></li><br/>    <li class=""><span>} &nbsp;&nbsp;</span></li><br/></ol><br/></div><br/><p>明白了吧。记得搜索的时候，如果需要搜索%和_这两个特殊字符，记得使用Input::forSearch</p><br/><div class="codeText"><br/><div class="codeHead">PHP代码</div><br/><ol class="dp-c"><br/>    <li class="alt"><span><span>import(</span><span class="string">'ORG.Util.HashMap'</span><span>); &nbsp;&nbsp;</span></span></li><br/>    <li class=""><span class="vars">$map</span><span>&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;HashMap(); &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span class="vars">$model</span><span>&nbsp;=&nbsp;D(</span><span class="string">'test'</span><span>); &nbsp;&nbsp;</span></li><br/>    <li class=""><span class="vars">$map</span><span>-&gt;put(</span><span class="string">'title'</span><span>,</span><span class="keyword">array</span><span>(</span><span class="string">'like'</span><span>,Input::forSearch(</span><span class="string">'%abc%efg'</span><span>)&nbsp;)); &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span class="vars">$data</span><span>&nbsp;=&nbsp;</span><span class="vars">$model</span><span>-&gt;findAll(</span><span class="vars">$map</span><span>);&nbsp;&nbsp;</span></li><br/></ol><br/></div><br/><p><br /><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br /><br/>搜索到的结果就是</p><br/><div class="codeText"><br/><div class="codeHead">XML/HTML代码</div><br/><ol class="dp-xml"><br/>    <li class="alt"><span><span>array(1)&nbsp;{ &nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>&nbsp;&nbsp;[0]&nbsp;=</span><span class="tag">&gt;</span><span>&nbsp;array(3)&nbsp;{ &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;[&quot;id&quot;]&nbsp;=</span><span class="tag">&gt;</span><span>&nbsp;string(1)&nbsp;&quot;9&quot; &nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;[&quot;title&quot;]&nbsp;=</span><span class="tag">&gt;</span><span>&nbsp;string(8)&nbsp;&quot;%abc%efg&quot; &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;[&quot;content&quot;]&nbsp;=</span><span class="tag">&gt;</span><span>&nbsp;string(66)&nbsp;&quot;I&nbsp;like&nbsp;ThinkPHP. &nbsp;&nbsp;</span></li><br/>    <li class=""><span class="tag">&lt;</span><span class="tag-name">b</span><span class="tag">&gt;</span><span>me&nbsp;too!</span><span class="tag">&lt;/</span><span class="tag-name">b</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>it's&nbsp;good!&quot; &nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;} &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>} &nbsp;&nbsp;</span></li><br/></ol><br/></div><br/><p>可能有人问，这个有必要吗？如果%或者_这种特殊字符也可以搜索的时候，就有用。</p><br/><p>到这里，关于ThinkPHP中的字符串的存贮，编辑，显示过程中的各种处理就分析完毕了。由于个人时间上的原因，写得比较仓促，还请见谅。</p>]]></description>
   <link>http://thinkphp.cn/Blog/27</link>
   <pubDate>Mon, 19 Jan 2009 14:13:35 +0800</pubDate>
  </item>
  <item>
   <title>网页中的字符串的处理[输入篇]</title>
   <description><![CDATA[<p>对于每一个程序，我一般都会使用一些特殊字符去检验其对字符串的处理能力。</p><br/><p>比如在提交JavaScript，提交类似 ,'','',''这种字符串。完美的结果应该是，字符串的输入、编辑、显示三种界面应该保持一致。</p><br/><p>那么，在ThinkPHP中，怎么进行处理呢。昨天我大致总结了一下，并重新修正了input.class.php。</p><br/><p>测试表单：</p><br/><div class="codeText"><br/><div class="codeHead">XML/HTML代码</div><br/><ol class="dp-xml"><br/>    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">form</span><span>&nbsp;</span><span class="attribute">action</span><span>=</span><span class="attribute-value">&quot;__URL__/save&quot;</span><span>&nbsp;</span><span class="attribute">method</span><span>=</span><span class="attribute-value">&quot;POST&quot;</span><span class="tag">&gt;</span><span>&nbsp; &nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>title：</span><span class="tag">&lt;</span><span class="tag-name">input</span><span>&nbsp;</span><span class="attribute">type</span><span>=</span><span class="attribute-value">&quot;text&quot;</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;title&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span class="tag">&lt;</span><span class="tag-name">br</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>content：</span><span class="tag">&lt;</span><span class="tag-name">textarea</span><span>&nbsp;</span><span class="attribute">rows</span><span>=</span><span class="attribute-value">&quot;10&quot;</span><span>&nbsp;</span><span class="attribute">cols</span><span>=</span><span class="attribute-value">&quot;30&quot;</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;content&quot;</span><span class="tag">&gt;&lt;/</span><span class="tag"><span class="tag-name">textarea</span><span class="tag">&gt;</span><span class="tag">&lt;</span><span class="tag-name">br</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li><br/>    <li class=""><span class="tag">&lt;</span><span class="tag-name">input</span><span>&nbsp;</span><span class="attribute">type</span><span>=</span><span class="attribute-value">&quot;submit&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li><br/>    <li class="alt"><span class="tag"><span class="tag-name">form</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li><br/></ol><br/></div><br/><p></p><br/><p>测试model：</p><br/><div class="codeText"><br/><div class="codeHead">PHP代码</div><br/><ol class="dp-c"><br/>    <li class="alt"><span><span><!--p   </sp--></span></span></li><br/>    <li class=""><span class="keyword">class</span><span>&nbsp;testModel&nbsp;</span><span class="keyword">extends</span><span>&nbsp;Model &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>{ &nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;</span><span class="keyword">var</span><span>&nbsp;</span><span class="vars">$tableName</span><span>&nbsp;=&nbsp;</span><span class="string">'test'</span><span>;&nbsp;&nbsp; &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>} &nbsp;&nbsp;</span></li><br/>    <li class=""><span>?&gt;&nbsp;&nbsp;</span></li><br/></ol><br/></div><br/><p>测试表</p><br/><div class="codeText"><br/><div class="codeHead">SQL代码</div><br/><ol class="dp-sql"><br/>    <li class="alt"><span><span class="keyword">CREATE</span><span>&nbsp;</span><span class="keyword">TABLE</span><span>&nbsp;`ta_test`&nbsp;( &nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>&nbsp;&nbsp;`id`&nbsp;</span><span class="keyword">int</span><span>(11)&nbsp;unsigned&nbsp;</span><span class="op">NOT</span><span>&nbsp;</span><span class="op">NULL</span><span>&nbsp;auto_increment, &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;`title`&nbsp;</span><span class="keyword">varchar</span><span>(255)&nbsp;</span><span class="keyword">default</span><span>&nbsp;</span><span class="op">NULL</span><span>, &nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;`content`&nbsp;text, &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;</span><span class="keyword">PRIMARY</span><span>&nbsp;</span><span class="keyword">KEY</span><span>&nbsp;&nbsp;(`id`) &nbsp;&nbsp;</span></li><br/>    <li class=""><span>)&nbsp;ENGINE=MyISAM&nbsp;</span><span class="keyword">DEFAULT</span><span>&nbsp;CHARSET=utf8;&nbsp;&nbsp;</span></li><br/></ol><br/></div><br/><p>&nbsp;</p><br/><p>测试环境：<br /><br/>Thinkphp可正常运行环境<br /><br/>magic_quotes = on<br /><br/>mysql</p><br/><p><strong>测试过程开始：</strong></p><br/><p>title中填写：<br /><br/><font color="#3366ff">ThinkPHP's Code</font></p><br/><p>content 中填写：<br /><br/><font color="#3366ff">I like ThinkPHP.<br /><br/><strong>me too!</strong><br /><br/>it's good!</font></p><br/><p>我们简单地create操作一下：</p><br/><div class="codeText"><br/><div class="codeHead">PHP代码</div><br/><ol class="dp-c"><br/>    <li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">function</span><span>&nbsp;save() &nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>{ &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$model</span><span>&nbsp;=&nbsp;D(</span><span class="string">'test'</span><span>); &nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$vo</span><span>&nbsp;=&nbsp;</span><span class="vars">$model</span><span>-&gt;create(); &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;dump(</span><span class="vars">$vo</span><span>); &nbsp;&nbsp;</span></li><br/>    <li class=""><span>}&nbsp;&nbsp;</span></li><br/></ol><br/></div><br/><p><br /><br/>&nbsp;&nbsp;&nbsp; <br /><br/>输出为：</p><br/><div class="codeText"><br/><div class="codeHead">XML/HTML代码</div><br/><ol class="dp-xml"><br/>    <li class="alt"><span><span>array(2)&nbsp;{ &nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>&nbsp;&nbsp;[&quot;title&quot;]&nbsp;=</span><span class="tag">&gt;</span><span>&nbsp;string(16)&nbsp;&quot;ThinkPHP\'s&nbsp;Code&quot; &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;[&quot;content&quot;]&nbsp;=</span><span class="tag">&gt;</span><span>&nbsp;string(67)&nbsp;&quot;I&nbsp;like&nbsp;ThinkPHP. &nbsp;&nbsp;</span></li><br/>    <li class=""><span class="tag">&lt;</span><span class="tag-name">b</span><span class="tag">&gt;</span><span>me&nbsp;too!</span><span class="tag"><span class="tag-name">b</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li><br/>    <li class="alt"><span>it\'s&nbsp;good!&quot; &nbsp;&nbsp;</span></li><br/>    <li class=""><span>}&nbsp;&nbsp;</span></li><br/></ol><br/></div><br/><p>现在修改为：</p><br/><div class="codeText"><br/><div class="codeHead">PHP代码</div><br/><ol class="dp-c"><br/>    <li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">function</span><span>&nbsp;save() &nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>{ &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;import(</span><span class="string">'Think.Util.Input'</span><span>); &nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;Input::noGPC(); &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$model</span><span>&nbsp;=&nbsp;D(</span><span class="string">'test'</span><span>); &nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$vo</span><span>&nbsp;=&nbsp;</span><span class="vars">$model</span><span>-&gt;create(); &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;dump(</span><span class="vars">$vo</span><span>); &nbsp;&nbsp;</span></li><br/>    <li class=""><span>}&nbsp;&nbsp;</span></li><br/></ol><br/></div><br/><p>输出为：</p><br/><div class="codeText"><br/><div class="codeHead">XML/HTML代码</div><br/><ol class="dp-xml"><br/>    <li class="alt"><span><span>array(2)&nbsp;{ &nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>&nbsp;&nbsp;[&quot;title&quot;]&nbsp;=</span><span class="tag">&gt;</span><span>&nbsp;string(15)&nbsp;&quot;ThinkPHP's&nbsp;Code&quot; &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;[&quot;content&quot;]&nbsp;=</span><span class="tag">&gt;</span><span>&nbsp;string(66)&nbsp;&quot;I&nbsp;like&nbsp;ThinkPHP. &nbsp;&nbsp;</span></li><br/>    <li class=""><span class="tag">&lt;</span><span class="tag-name">b</span><span class="tag">&gt;</span><span>me&nbsp;too!</span><span class="tag"><span class="tag-name">b</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li><br/>    <li class="alt"><span>it's&nbsp;good!&quot; &nbsp;&nbsp;</span></li><br/>    <li class=""><span>}&nbsp;&nbsp;</span></li><br/></ol><br/></div><br/><p>这样就得到的是原样的输入，但是一般不建议使用Input::noGPC();，因为它将所有$_POST,$_GET进行了sripslashes_deep操作。最好是用到哪个就使用Input::getVar($_POST['title']);</p><br/><p>然后，我们将dump($vo);修改为$model-&gt;add();，再提交一次。</p><br/><p>内容被原样保存到数据库了。可见ThinkPHP's Code中的引号没有产生影响。</p><br/><p>我们进行分析一下：<br /><br/>&nbsp;数据create之后是上面所说的样子，add() 将数据传送到 _create()，然后是其中的一句：<br /><br/>&nbsp;$result = $this-&gt;db-&gt;add($data,$table,$multi)<br /><br/>&nbsp;而这个$this-&gt;db就是DbMysql这个类。其中add()是继承的Db类。<br /><br/>&nbsp;<br /><br/>&nbsp;我们最终在Db.class.php找到了这个函数。<br /><br/>&nbsp;<br /><br/>&nbsp;而转义的处理，就是在 $val&nbsp;&nbsp;&nbsp; =&nbsp;&nbsp; $this-&gt;fieldFormat($val);这一句。<br /><br/>&nbsp;<br /><br/>&nbsp;我们单独把这个函数提取来：&nbsp;<br /><br/>&nbsp;</p><br/><div class="codeText"><br/><div class="codeHead">PHP代码</div><br/><ol class="dp-c"><br/>    <li class="alt"><span><span class="keyword">protected</span><span>&nbsp;</span><span class="keyword">function</span><span>&nbsp;fieldFormat(</span><span class="vars">$value</span><span>,</span><span class="vars">$asString</span><span>=true,</span><span class="vars">$multi</span><span>=false) &nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>{ &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(</span><span class="vars">$multi</span><span>&nbsp;==&nbsp;true)&nbsp;{ &nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$asString</span><span>&nbsp;=&nbsp;true; &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(</span><span class="func">is_int</span><span>(</span><span class="vars">$value</span><span>))&nbsp;{ &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$value</span><span>&nbsp;=&nbsp;</span><span class="func">intval</span><span>(</span><span class="vars">$value</span><span>); &nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}</span><span class="keyword">elseif</span><span>(</span><span class="func">is_float</span><span>(</span><span class="vars">$value</span><span>))&nbsp;{ &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$value</span><span>&nbsp;=&nbsp;</span><span class="func">floatval</span><span>(</span><span class="vars">$value</span><span>); &nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}</span><span class="keyword">elseif</span><span>(!</span><span class="vars">$asString</span><span>){ &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$value</span><span>&nbsp;=&nbsp;</span><span class="vars">$this</span><span>-&gt;escape_string(</span><span class="vars">$value</span><span>); &nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}</span><span class="keyword">elseif</span><span>(</span><span class="func">is_string</span><span>(</span><span class="vars">$value</span><span>))&nbsp;{ &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$value</span><span>&nbsp;=&nbsp;</span><span class="string">'\''</span><span>.</span><span class="vars">$this</span><span>-&gt;escape_string(</span><span class="vars">$value</span><span>).</span><span class="string">'\''</span><span>; &nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}</span><span class="keyword">elseif</span><span>(</span><span class="func">is_null</span><span>(</span><span class="vars">$value</span><span>)){ &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$value</span><span>&nbsp;&nbsp;&nbsp;=&nbsp;&nbsp;</span><span class="string">'null'</span><span>; &nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="vars">$value</span><span>; &nbsp;&nbsp;</span></li><br/>    <li class=""><span>} &nbsp;&nbsp;</span></li><br/></ol><br/></div><br/><p><br /><br/>看到了吧，ThinkPHP在这里对每个字段都进行了处理。所以，你需要做的，就是按照输入的样子原样传递给ThinkPHP，不要自己再转义。</p><br/><p>下面不使用create呢：</p><br/><div class="codeText"><br/><div class="codeHead">PHP代码</div><br/><ol class="dp-c"><br/>    <li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">function</span><span>&nbsp;save() &nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>{ &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;import(</span><span class="string">'Think.Util.Input'</span><span>); &nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;Input::magicQuotes(); &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$model</span><span>&nbsp;=&nbsp;D(</span><span class="string">'test'</span><span>); &nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$model</span><span>-&gt;find(1); &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$model</span><span>-&gt;title&nbsp;=&nbsp;</span><span class="string">'sdadsa\d\ds\'\''</span><span>; &nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$model</span><span>-&gt;save(); &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>} &nbsp;&nbsp;</span></li><br/></ol><br/></div><br/><p>&nbsp;上面的代码正确地插入了数据。</p><br/><div class="codeText"><br/><div class="codeHead">PHP代码</div><br/><ol class="dp-c"><br/>    <li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">function</span><span>&nbsp;save() &nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>{ &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;import(</span><span class="string">'Think.Util.Input'</span><span>); &nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$model</span><span>&nbsp;=&nbsp;D(</span><span class="string">'test'</span><span>); &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$data</span><span>&nbsp;=&nbsp;</span><span class="keyword">array</span><span>( &nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="string">'title'</span><span>&nbsp;=&gt;&nbsp;Input::getVar(</span><span class="vars">$_POST</span><span>[</span><span class="string">'title'</span><span>]), &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="string">'content'</span><span>&nbsp;=&gt;&nbsp;Input::getVar(</span><span class="vars">$_POST</span><span>[</span><span class="string">'content'</span><span>]), &nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;); &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$model</span><span>-&gt;add(</span><span class="vars">$data</span><span>); &nbsp;&nbsp;</span></li><br/>    <li class=""><span>} &nbsp;&nbsp;</span></li><br/></ol><br/></div><br/><p>上面的代码正确地插入了数据。</p><br/><p>看到这里应该明白了吧。</p><br/><p>我们总结一下，ThinkPHP保存数据的时候的原则：传送给ThinkPHP一个干净的数据。</p>]]></description>
   <link>http://thinkphp.cn/Blog/26</link>
   <pubDate>Mon, 19 Jan 2009 14:08:38 +0800</pubDate>
  </item>
  <item>
   <title>发布ThinkPHP1.5Lite版</title>
   <description><![CDATA[<p>发布该版本的原因是很多应用开发要求较高的性能并且不需要很多特殊的功能</p><br/><p><font color="#ff0000"><strong>Lite版本提供网站开发最需要的功能，优化性能，更适合大型项目！</strong></font><font color="#000000"></font></p><br/><p>[ <strong>功能列表</strong> ]<br /><br/><br /><br/>编译缓存<br /><br/>自动生成<br /><br/>异常处理<br /><br/>URL模式<br /><br/>语言包支持<br /><br/>模板主题支持<br /><br/>空模块和空操作<br /><br/>前置和后置操作<br /><br/>智能数据表识别<br /><br/>自动加载<br /><br/>标签库<br /><br/>类库导入<br /><br/>Vendor支持<br /><br/>ADSL方法<br /><br/>跨库操作<br /><br/>字段映射<br /><br/>URL组装<br /><br/>URL伪静态<br /><br/>原生SQL操作<br /><br/>多数据库连接和切换<br /><br/>分布式数据库支持<br /><br/>支持MySql和PDO<br /><br/>惯例配置<br /><br/>项目配置<br /><br/>动态配置<br /><br/>模块配置<br /><br/>静态缓存<br /><br/>动态缓存<br /><br/>模板引擎和扩展支持<br /><br/>日志处理<br /><br/>SQL日志<br /><br/>调试模式<br /><br/>运行时间显示<br /><br/>页面Trace<br /><br/>类库扩展<br /><br/>自动验证<br /><br/>自动完成<br /><br/>CURD基本<br /><br/>AR模式基本<br /><br/>连贯操作</p><br/><p>[ <strong>注意事项</strong> ]<br /><br/>去掉了ORG类库包（自己可以增加扩展）<br /><br/>保留文件缓存驱动<br /><br/>保留内置模板引擎和PHP模板引擎驱动<br /><br/>查询条件只支持字符串<br /><br/>CURD接口和数据库接口已经更改（和标准版不兼容）<br /><br/>视图模型和关联操作已经去掉<br /><br/>模型的数据操作保留了 add save delete find query execute 增加了select方法 并做了参数的调整<br /><br/>去掉了自动获取数据表字段信息 改由模型自己定义或者不定义<br /><br/>保留运行信息和页面Trace显示<br /><br/>去掉了URL路由功能（该部分功能可以用空模块和空操作取代）</p><br/><p>[ <a href="http://thinkphp.cn/Down/download/id/107">下载Lite版本</a>&nbsp;] 整个框架打包大小不到75k<br /><br/>SVN下载：<a href="http://thinkphp.googlecode.com/svn/branches/Lite/">http://thinkphp.googlecode.com/svn/branches/Lite/</a> <br /><br/><br /><br/>由于效率的针对优化，所以在数据库操作这块有一些不兼容的地方（其他的包括缓存驱动和模板引擎驱动都是一样的，只是删除了部分驱动而已，唯独数据库驱动是不能直接用原来的了），因为如果全部保留之前的模型和数据库操作 那样的精简版没有实质的改变，所以建议是Lite版本给那些经常需要对TP定制和二次开发的有经验的PHP开发人员使用。</p>]]></description>
   <link>http://thinkphp.cn/Blog/25</link>
   <pubDate>Mon, 19 Jan 2009 10:06:04 +0800</pubDate>
  </item>
  <item>
   <title>测试用例详解</title>
   <description><![CDATA[<p>在上篇文章中介绍了如何使用PHPUnit进行单元测试，现在我就来谈谈如何编写测试用例以及怎样保证测试的全面性。<br /><br/>通常的测试用例继承自PHPUnit_Framework_TestCase类，其中的每个测试都以test开头，而且声明为公共类型public。每个测试用例都有一个构建方法setUp()和拆除方法tearDown()，分别在每个测试执行之前和之后执行，这两个方法都声明为被保护类型protected。测试语句的类型包括断言、标记跳过、标记未完成。自动生成的测试类使用标记未完成来表示该测试未完成，在测试条件不满足的情况下要使用标记跳过，如测试Oracle数据库驱动时没有Oracle数据库环境、Linux下无法测试SQL Server数据库驱动等。测试结果包括成功、失败和错误。出现错误的结果说明你的代码中有语法或运行时错误，这些错误要首先被解决。<br /><br/><br /><br/><strong>标记未完成</strong><br /><br/>在开始写测试用例时，我们使用标记跳过来表示测试是未完成的，这样做和什么都不写的区别是后者会认为测试是成功的，而你可能会在之后忘了写测试。</p><br/><div class="codeText"><br/><div class="codeHead">PHP代码</div><br/><ol class="dp-c" start="1"><br/>    <li class="alt">&nbsp;</li><br/>    <li class=""><span><span class="keyword">class</span><span>&nbsp;UnitTest&nbsp;</span><span class="keyword">extends</span><span>&nbsp;PHPUnit_Framework_TestCase&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span>{&nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">/**</span>&nbsp;</span></li><br/>    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;测试Hello()方法</span>&nbsp;</span></li><br/>    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">function</span><span>&nbsp;testHello()&nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$this</span><span>-&gt;markTestIncomplete(</span><span class="string">'这是一个未完成的测试'</span><span>);&nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>}&nbsp;&nbsp;</span></li><br/>    <li class=""><span>?&gt;&nbsp;&nbsp;</span></li><br/></ol><br/></div><br/><p><strong>标记跳过</strong><br /><br/>使用标记跳过来跳过不满足测试条件的情况，避免出现错误而影响测试结果。</p><br/><div class="codeText"><br/><div class="codeHead">PHP代码</div><br/><ol class="dp-c" start="1"><br/>    <li class="alt">&nbsp;</li><br/>    <li class=""><span><span class="keyword">class</span><span>&nbsp;UnitTest&nbsp;</span><span class="keyword">extends</span><span>&nbsp;PHPUnit_Framework_TestCase&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span>{&nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">protected</span><span>&nbsp;</span><span class="keyword">function</span><span>&nbsp;setUp()&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;该测试用例需要xxx扩展，如果不满足就跳过</span><span>&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(!</span><span class="func">extension_loaded</span><span>(</span><span class="string">'xxx'</span><span>))&nbsp;{&nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$this</span><span>-&gt;markTestSkipped(</span><span class="string">'这是一个跳过的测试'</span><span>);&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>}&nbsp;&nbsp;</span></li><br/>    <li class=""><span>?&gt;&nbsp;&nbsp;</span></li><br/></ol><br/></div><br/><p><strong>断言</strong><br /><br/>布尔类型<br /><br/>assertTrue&nbsp;&nbsp; 断言为真<br /><br/>assertFalse&nbsp; 断言为假</p><br/><p>NULL类型<br /><br/>assertNull&nbsp;&nbsp;&nbsp;&nbsp; 断言为NULL<br /><br/>assertNotNull&nbsp; 断言非NULL</p><br/><p>数字类型<br /><br/>assertEquals&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 断言等于<br /><br/>assertNotEquals&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 断言不等于<br /><br/>assertGreaterThan&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 断言大于<br /><br/>assertGreaterThanOrEqual 断言大于等于<br /><br/>assertLessThan&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 断言小于<br /><br/>assertLessThanOrEqual&nbsp;&nbsp;&nbsp; 断言小于等于</p><br/><p>字符类型<br /><br/>assertEquals&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 断言等于<br /><br/>assertNotEquals&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 断言不等于<br /><br/>assertContains&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 断言包含<br /><br/>assertNotContains&nbsp;&nbsp;&nbsp;&nbsp; 断言不包含<br /><br/>assertContainsOnly&nbsp;&nbsp;&nbsp; 断言只包含<br /><br/>assertNotContainsOnly 断言不只包含</p><br/><p>数组类型<br /><br/>assertEquals&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 断言等于<br /><br/>assertNotEquals&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 断言不等于<br /><br/>assertArrayHasKey&nbsp;&nbsp;&nbsp;&nbsp; 断言有键<br /><br/>assertArrayNotHasKey&nbsp; 断言没有键<br /><br/>assertContains&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 断言包含<br /><br/>assertNotContains&nbsp;&nbsp;&nbsp;&nbsp; 断言不包含<br /><br/>assertContainsOnly&nbsp;&nbsp;&nbsp; 断言只包含<br /><br/>assertNotContainsOnly 断言不只包含<br /><br/><br /><br/>对象类型<br /><br/>assertAttributeContains&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 断言属性包含<br /><br/>assertAttributeContainsOnly&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 断言属性只包含<br /><br/>assertAttributeEquals&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 断言属性等于<br /><br/>assertAttributeGreaterThan&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 断言属性大于<br /><br/>assertAttributeGreaterThanOrEqual 断言属性大于等于<br /><br/>assertAttributeLessThan&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 断言属性小于<br /><br/>assertAttributeLessThanOrEqual&nbsp;&nbsp;&nbsp; 断言属性小于等于<br /><br/>assertAttributeNotContains&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 断言不包含<br /><br/>assertAttributeNotContainsOnly&nbsp;&nbsp;&nbsp; 断言属性不只包含<br /><br/>assertAttributeNotEquals&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 断言属性不等于<br /><br/>assertAttributeNotSame&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 断言属性不相同<br /><br/>assertAttributeSame&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 断言属性相同<br /><br/>assertSame&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 断言类型和值都相同<br /><br/>assertNotSame&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 断言类型或值不相同<br /><br/>assertObjectHasAttribute&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 断言对象有某属性<br /><br/>assertObjectNotHasAttribute&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 断言对象没有某属性</p><br/><p>class类型<br /><br/>class类型包含对象类型的所有断言，还有<br /><br/>assertClassHasAttribute&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 断言类有某属性<br /><br/>assertClassHasStaticAttribute&nbsp;&nbsp;&nbsp; 断言类有某静态属性<br /><br/>assertClassNotHasAttribute&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 断言类没有某属性<br /><br/>assertClassNotHasStaticAttribute 断言类没有某静态属性</p><br/><p>文件相关<br /><br/>assertFileEquals&nbsp;&nbsp;&nbsp;&nbsp; 断言文件内容等于<br /><br/>assertFileExists&nbsp;&nbsp;&nbsp;&nbsp; 断言文件存在<br /><br/>assertFileNotEquals&nbsp; 断言文件内容不等于<br /><br/>assertFileNotExists&nbsp; 断言文件不存在</p><br/><p>XML相关<br /><br/>assertXmlFileEqualsXmlFile&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 断言XML文件内容相等<br /><br/>assertXmlFileNotEqualsXmlFile&nbsp;&nbsp;&nbsp;&nbsp; 断言XML文件内容不相等<br /><br/>assertXmlStringEqualsXmlFile&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 断言XML字符串等于XML文件内容<br /><br/>assertXmlStringEqualsXmlString&nbsp;&nbsp;&nbsp; 断言XML字符串相等<br /><br/>assertXmlStringNotEqualsXmlFile&nbsp;&nbsp; 断言XML字符串不等于XML文件内容<br /><br/>assertXmlStringNotEqualsXmlString 断言XML字符串不相等</p><br/><p>有返回值的方法或函数根据其类型选择相应的断言，下面是一个简单例子。</p><br/><div class="codeText"><br/><div class="codeHead">PHP代码</div><br/><ol class="dp-c" start="1"><br/>    <li class="alt">&nbsp;</li><br/>    <li class=""><span><span class="keyword">class</span><span>&nbsp;UnitTest&nbsp;</span><span class="keyword">extends</span><span>&nbsp;PHPUnit_Framework_TestCase&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span>{&nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">/**</span>&nbsp;</span></li><br/>    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;测试返回值为布尔类型</span>&nbsp;</span></li><br/>    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">function</span><span>&nbsp;testReturnBool()&nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;实际情况把TRUE和FALSE换为被测试方法或函数</span><span>&nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$this</span><span>-&gt;assertTrue(TRUE);&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$this</span><span>-&gt;assertFalse(FALSE);&nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">/**</span>&nbsp;</span></li><br/>    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;测试返回值为字符串类型</span>&nbsp;</span></li><br/>    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">function</span><span>&nbsp;testReturnString()&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$expected</span><span>&nbsp;=&nbsp;</span><span class="string">'string'</span><span>;&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;实际情况把下面的'string'换为被测试方法或函数</span><span>&nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$result</span><span>&nbsp;=&nbsp;</span><span class="string">'string'</span><span>;&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$this</span><span>-&gt;assertEquals(</span><span class="vars">$expected</span><span>,&nbsp;</span><span class="vars">$result</span><span>);&nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">/**</span>&nbsp;</span></li><br/>    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;测试返回值是数字类型</span>&nbsp;</span></li><br/>    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">function</span><span>&nbsp;testReturnInt()&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$expected</span><span>&nbsp;=&nbsp;10;&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;实际情况把20换为被测试方法或函数</span><span>&nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$result</span><span>&nbsp;=&nbsp;20;&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$this</span><span>-&gt;assertGreaterThan(</span><span class="vars">$expected</span><span>,&nbsp;</span><span class="vars">$result</span><span>);&nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">/**</span>&nbsp;</span></li><br/>    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;测试返回值是数组类型</span>&nbsp;</span></li><br/>    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">function</span><span>&nbsp;testReturnArray()&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;实际情况把$result赋值为被测试方法或函数</span><span>&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$result</span><span>&nbsp;=&nbsp;</span><span class="keyword">array</span><span>(</span><span class="string">'test'</span><span>&nbsp;=&gt;&nbsp;</span><span class="string">'hello'</span><span>);&nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;实际情况把'test'换为要测试的键名称</span><span>&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$this</span><span>-&gt;assertArrayHasKey(</span><span class="string">'test'</span><span>,&nbsp;</span><span class="vars">$result</span><span>);&nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">/**</span>&nbsp;</span></li><br/>    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;测试返回值是对象类型</span>&nbsp;</span></li><br/>    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">function</span><span>&nbsp;testReturnObject()&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;实际情况把$this换为期望的对象</span><span>&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$expected</span><span>&nbsp;=&nbsp;</span><span class="vars">$this</span><span>;&nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;实际情况把$this换为被测试方法或函数</span><span>&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$result</span><span>&nbsp;=&nbsp;</span><span class="vars">$this</span><span>;&nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$this</span><span>-&gt;assertSame(</span><span class="vars">$expected</span><span>,&nbsp;</span><span class="vars">$result</span><span>);&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><br/>    <li class=""><span>}&nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>?&gt;&nbsp;&nbsp;</span></li><br/></ol><br/></div><br/><p>无返回值的方法，可以通过其他方法读取属性，也可以使用对象类型中的断言来判断属性的改变。</p><br/><div class="codeText"><br/><div class="codeHead">PHP代码</div><br/><ol class="dp-c" start="1"><br/>    <li class="alt">&nbsp;</li><br/>    <li class=""><span><span class="comment">/**</span>&nbsp;</span></li><br/>    <li class="alt"><span><span class="comment">&nbsp;*&nbsp;Unit类，有一个无返回值方法</span>&nbsp;</span></li><br/>    <li class=""><span><span class="comment">&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span><span class="keyword">class</span><span>&nbsp;Unit&nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>{&nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">protected</span><span>&nbsp;</span><span class="vars">$name</span><span>;&nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">/**</span>&nbsp;</span></li><br/>    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;设置name属性</span>&nbsp;</span></li><br/>    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">function</span><span>&nbsp;setName(</span><span class="vars">$value</span><span>)&nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$this</span><span>-&gt;name&nbsp;=&nbsp;</span><span class="vars">$value</span><span>;&nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>}&nbsp;&nbsp;</span></li><br/>    <li class=""><span>?&gt;&nbsp;&nbsp;</span></li><br/></ol><br/></div><br/><div class="codeText"><br/><div class="codeHead">PHP代码</div><br/><ol class="dp-c" start="1"><br/>    <li class="alt">&nbsp;</li><br/>    <li class=""><span><span class="keyword">require_once</span><span>&nbsp;</span><span class="string">'Unit.php'</span><span>;&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;</span></li><br/>    <li class=""><span><span class="keyword">class</span><span>&nbsp;UnitTest&nbsp;</span><span class="keyword">extends</span><span>&nbsp;PHPUnit_Framework_TestCase&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span>{&nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">/**</span>&nbsp;</span></li><br/>    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;测试无返回值的方法</span>&nbsp;</span></li><br/>    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">function</span><span>&nbsp;testsetName()&nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$expected</span><span>&nbsp;=&nbsp;</span><span class="string">'Hello'</span><span>;&nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$o</span><span>&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;Unit();&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$o</span><span>-&gt;setName(</span><span class="string">'Hello'</span><span>);&nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$this</span><span>-&gt;assertAttributeEquals(</span><span class="vars">$expected</span><span>,&nbsp;</span><span class="string">'name'</span><span>,&nbsp;</span><span class="vars">$o</span><span>);&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><br/>    <li class=""><span>}&nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>?&gt;&nbsp;&nbsp;</span></li><br/></ol><br/></div><br/><p><strong>编写测试</strong><br /><br/>编写测试的原则是，尽可能测试每种不同的参数调用和不同的返回结果类型，既要测试成功的情况，也要测试失败的情况；无返回值的情况，要测试属性改变、输出内容、异常类型等；测试后记得要恢复现场。</p><br/><p>在这里做了超出自己能力的事并不光荣。在你写某个函数之前，你只想让它做加法，但它却能做乘法，而且单元测试正确通过。我们来看看它是怎么做到的。</p><br/><div class="codeText"><br/><div class="codeHead">PHP代码</div><br/><ol class="dp-c" start="1"><br/>    <li class="alt">&nbsp;</li><br/>    <li class=""><span><span class="comment">/**</span>&nbsp;</span></li><br/>    <li class="alt"><span><span class="comment">&nbsp;*&nbsp;计算器类</span>&nbsp;</span></li><br/>    <li class=""><span><span class="comment">&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span><span class="keyword">class</span><span>&nbsp;Calculator&nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>{&nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">/**</span>&nbsp;</span></li><br/>    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;做加法运算</span>&nbsp;</span></li><br/>    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span>&nbsp;</span></li><br/>    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;&nbsp;int&nbsp;&nbsp;$a</span>&nbsp;</span></li><br/>    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;&nbsp;int&nbsp;&nbsp;$b</span>&nbsp;</span></li><br/>    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@return&nbsp;int</span>&nbsp;</span></li><br/>    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">function</span><span>&nbsp;add(</span><span class="vars">$a</span><span>,&nbsp;</span><span class="vars">$b</span><span>)&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;</span><span class="vars">$a</span><span>&nbsp;*&nbsp;</span><span class="vars">$b</span><span>;&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><br/>    <li class=""><span>}&nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>?&gt;&nbsp; <br /><br/>    </span></li><br/></ol><br/></div><br/><div class="codeText"><br/><div class="codeHead">PHP代码</div><br/><ol class="dp-c" start="1"><br/>    <li class="alt">&nbsp;</li><br/>    <li class=""><span><span class="keyword">require_once</span><span>&nbsp;</span><span class="string">'Calculator.php'</span><span>;&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;</span></li><br/>    <li class=""><span><span class="keyword">class</span><span>&nbsp;CalcuatorTest&nbsp;</span><span class="keyword">extends</span><span>&nbsp;PHPUnit_Framework_TestCase&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span>{&nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">function</span><span>&nbsp;testadd()&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;创建实例</span><span>&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$c</span><span>&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;Calculator();&nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$expected</span><span>&nbsp;=&nbsp;4;&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;做加法</span><span>&nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$result</span><span>&nbsp;=&nbsp;</span><span class="vars">$c</span><span>-&gt;add(2,&nbsp;2);&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$this</span><span>-&gt;assertEquals(</span><span class="vars">$expected</span><span>,&nbsp;</span><span class="vars">$result</span><span>);&nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>}&nbsp;&nbsp;</span></li><br/>    <li class=""><span>?&gt;&nbsp;&nbsp;</span></li><br/></ol><br/></div><br/><p>合理的测试能帮助我们尽早发现错误。add()方法有两个参数，测试的时候用了两个值相同的参数。如果多做几次测试又太麻烦，对于这个测试我们按照科学的方法只需要一次。从概率学上讲，当你使用的参数差异越大时，结果相同的概率越低。</p><br/><p>对于只有几个返回值的情况，要测试全部，如布尔类型。</p><br/><div class="codeText"><br/><div class="codeHead">PHP代码</div><br/><ol class="dp-c" start="1"><br/>    <li class="alt">&nbsp;</li><br/>    <li class=""><span><span class="comment">/**</span>&nbsp;</span></li><br/>    <li class="alt"><span><span class="comment">&nbsp;*&nbsp;File.php</span>&nbsp;</span></li><br/>    <li class=""><span><span class="comment">&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;</span></li><br/>    <li class=""><span><span class="comment">/**</span>&nbsp;</span></li><br/>    <li class="alt"><span><span class="comment">&nbsp;*&nbsp;在文件中写入数据并保存</span>&nbsp;</span></li><br/>    <li class=""><span><span class="comment">&nbsp;*</span>&nbsp;</span></li><br/>    <li class="alt"><span><span class="comment">&nbsp;*&nbsp;@param&nbsp;&nbsp;string&nbsp;&nbsp;$path</span>&nbsp;</span></li><br/>    <li class=""><span><span class="comment">&nbsp;*&nbsp;@param&nbsp;&nbsp;string&nbsp;&nbsp;$data</span>&nbsp;</span></li><br/>    <li class="alt"><span><span class="comment">&nbsp;*&nbsp;@return&nbsp;bool</span>&nbsp;</span></li><br/>    <li class=""><span><span class="comment">&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span><span class="keyword">function</span><span>&nbsp;Save(</span><span class="vars">$path</span><span>,&nbsp;</span><span class="vars">$data</span><span>)&nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>{&nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(</span><span class="func">is_dir</span><span>(</span><span class="vars">$path</span><span>))&nbsp;{&nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;FALSE;&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;</span><span class="func">file_put_contents</span><span>(</span><span class="vars">$path</span><span>,&nbsp;</span><span class="vars">$data</span><span>);&nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>}&nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>?&gt;&nbsp; <br /><br/>    </span></li><br/></ol><br/></div><br/><div class="codeText"><br/><div class="codeHead">PHP代码</div><br/><ol class="dp-c" start="1"><br/>    <li class="alt">&nbsp;</li><br/>    <li class=""><span><span class="comment">/**</span>&nbsp;</span></li><br/>    <li class="alt"><span><span class="comment">&nbsp;*&nbsp;FileTest.php</span>&nbsp;</span></li><br/>    <li class=""><span><span class="comment">&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;</span></li><br/>    <li class=""><span><span class="keyword">require_once</span><span>&nbsp;</span><span class="string">'File.php'</span><span>;&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;</span></li><br/>    <li class=""><span><span class="keyword">class</span><span>&nbsp;FileTest&nbsp;</span><span class="keyword">extends</span><span>&nbsp;PHPUnit_Framework_TestCase&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span>{&nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">/**</span>&nbsp;</span></li><br/>    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;测试保存文件</span>&nbsp;</span></li><br/>    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">function</span><span>&nbsp;testSave()&nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$file</span><span>&nbsp;=&nbsp;</span><span class="string">'IamFile.txt'</span><span>;&nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$dir</span><span>&nbsp;=&nbsp;</span><span class="string">'IamDir'</span><span>;&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="func">mkdir</span><span>(</span><span class="vars">$dir</span><span>);&nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>&nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;测试返回值为真的情况</span><span>&nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$this</span><span>-&gt;assertTrue(Save(</span><span class="vars">$file</span><span>,&nbsp;</span><span class="string">'TestTrue'</span><span>));&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;测试返回值为假的情况</span><span>&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$this</span><span>-&gt;assertFalse(Save(</span><span class="vars">$dir</span><span>,&nbsp;</span><span class="string">'TestFalse'</span><span>));&nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>&nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;恢复现场</span><span>&nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(</span><span class="func">is_file</span><span>(</span><span class="vars">$file</span><span>))&nbsp;{&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unlink(<span class="vars">$file</span><span>);&nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="func">rmdir</span><span>(</span><span class="vars">$dir</span><span>);&nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>}&nbsp;&nbsp;</span></li><br/>    <li class=""><span>?&gt;&nbsp;&nbsp;</span></li><br/></ol><br/></div><br/><p>对于有多种类型返回值或不同参数的情况，分别测试每种类型和参数。下面是ThinkPHP源代码中的一个函数，有点复杂。这个例子不能单独运行，如需要请用SVN导出最新的ThinkPHP源代码（含单元测试）。</p><br/><div class="codeText"><br/><div class="codeHead">PHP代码</div><br/><ol class="dp-c" start="1"><br/>    <li class="alt">&nbsp;</li><br/>    <li class=""><span><span class="comment">/**</span>&nbsp;</span></li><br/>    <li class="alt"><span><span class="comment">&nbsp;*&nbsp;URL生成函数</span>&nbsp;</span></li><br/>    <li class=""><span><span class="comment">&nbsp;*</span>&nbsp;</span></li><br/>    <li class="alt"><span><span class="comment">&nbsp;*&nbsp;@param&nbsp;&nbsp;string&nbsp;&nbsp;$action&nbsp;&nbsp;方法名</span>&nbsp;</span></li><br/>    <li class=""><span><span class="comment">&nbsp;*&nbsp;@param&nbsp;&nbsp;string&nbsp;&nbsp;$module&nbsp;&nbsp;模块名</span>&nbsp;</span></li><br/>    <li class="alt"><span><span class="comment">&nbsp;*&nbsp;@param&nbsp;&nbsp;string&nbsp;&nbsp;$route&nbsp;&nbsp;&nbsp;路由名</span>&nbsp;</span></li><br/>    <li class=""><span><span class="comment">&nbsp;*&nbsp;@param&nbsp;&nbsp;array&nbsp;&nbsp;&nbsp;$params&nbsp;&nbsp;参数</span>&nbsp;</span></li><br/>    <li class="alt"><span><span class="comment">&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li><br/>    <li class=""><span><span class="keyword">function</span><span>&nbsp;url(</span><span class="vars">$action</span><span>=ACTION_NAME,</span><span class="vars">$module</span><span>=MODULE_NAME,</span><span class="vars">$route</span><span>=</span><span class="string">''</span><span>,</span><span class="vars">$app</span><span>=APP_NAME,</span><span class="vars">$params</span><span>=</span><span class="keyword">array</span><span>())&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span>{&nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>(C(</span><span class="string">'DISPATCH_ON'</span><span>)&nbsp;&amp;&amp;&nbsp;C(</span><span class="string">'URL_MODEL'</span><span>)&gt;0)&nbsp;{&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">switch</span><span>(C(</span><span class="string">'PATH_MODEL'</span><span>))&nbsp;{&nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">case</span><span>&nbsp;1:</span><span class="comment">//&nbsp;普通PATHINFO模式</span><span>&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$str</span><span>&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;&nbsp;&nbsp;</span><span class="string">'/'</span><span>;&nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">foreach</span><span>&nbsp;(</span><span class="vars">$params</span><span>&nbsp;</span><span class="keyword">as</span><span>&nbsp;</span><span class="vars">$var</span><span>=&gt;</span><span class="vars">$val</span><span>)&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$str</span><span>&nbsp;.=&nbsp;</span><span class="vars">$var</span><span>.</span><span class="string">'/'</span><span>.</span><span class="vars">$val</span><span>.</span><span class="string">'/'</span><span>;&nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$str</span><span>&nbsp;=&nbsp;</span><span class="func">substr</span><span>(</span><span class="vars">$str</span><span>,0,-1);&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>(!</span><span class="func">empty</span><span class="keyword">empty</span><span>(</span><span class="vars">$route</span><span>))&nbsp;{&nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$url</span><span>&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;&nbsp;&nbsp;</span><span class="func">str_replace</span><span>(APP_NAME,</span><span class="vars">$app</span><span>,__APP__).</span><span class="string">'/'</span><span>.C(</span><span class="string">'VAR_ROUTER'</span><span>).</span><span class="string">'/'</span><span>.</span><span class="vars">$route</span><span>.</span><span class="string">'/'</span><span>.</span><span class="vars">$str</span><span>;&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<span class="keyword">else</span><span>{&nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$url</span><span>&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;&nbsp;&nbsp;</span><span class="func">str_replace</span><span>(APP_NAME,</span><span class="vars">$app</span><span>,__APP__).</span><span class="string">'/'</span><span>.C(</span><span class="string">'VAR_MODULE'</span><span>).</span><span class="string">'/'</span><span>.</span><span class="vars">$module</span><span>.</span><span class="string">'/'</span><span>.C(</span><span class="string">'VAR_ACTION'</span><span>).</span><span class="string">'/'</span><span>.</span><span class="vars">$action</span><span>.</span><span class="vars">$str</span><span>;&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">break</span><span>;&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">case</span><span>&nbsp;2:</span><span class="comment">//&nbsp;智能PATHINFO模式</span><span>&nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$depr</span><span>&nbsp;&nbsp;&nbsp;=&nbsp;&nbsp;&nbsp;C(</span><span class="string">'PATH_DEPR'</span><span>);&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$str</span><span>&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;&nbsp;&nbsp;</span><span class="vars">$depr</span><span>;&nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">foreach</span><span>&nbsp;(</span><span class="vars">$params</span><span>&nbsp;</span><span class="keyword">as</span><span>&nbsp;</span><span class="vars">$var</span><span>=&gt;</span><span class="vars">$val</span><span>)&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$str</span><span>&nbsp;.=&nbsp;</span><span class="vars">$var</span><span>.</span><span class="vars">$depr</span><span>.</span><span class="vars">$val</span><span>.</span><span class="vars">$depr</span><span>;&nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$str</span><span>&nbsp;=&nbsp;</span><span class="func">substr</span><span>(</span><span class="vars">$str</span><span>,0,-1);&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>(!</span><span class="func">empty</span><span class="keyword">empty</span><span>(</span><span class="vars">$route</span><span>))&nbsp;{&nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$url</span><span>&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;&nbsp;&nbsp;</span><span class="func">str_replace</span><span>(APP_NAME,</span><span class="vars">$app</span><span>,__APP__).</span><span class="string">'/'</span><span>.</span><span class="vars">$route</span><span>.</span><span class="vars">$str</span><span>;&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<span class="keyword">else</span><span>{&nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$url</span><span>&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;&nbsp;&nbsp;</span><span class="func">str_replace</span><span>(APP_NAME,</span><span class="vars">$app</span><span>,__APP__).</span><span class="string">'/'</span><span>.</span><span class="vars">$module</span><span>.</span><span class="vars">$depr</span><span>.</span><span class="vars">$action</span><span>.</span><span class="vars">$str</span><span>;&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">break</span><span>;&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>(C(</span><span class="string">'HTML_URL_SUFFIX'</span><span>))&nbsp;{&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$url</span><span>&nbsp;.=&nbsp;C(</span><span class="string">'HTML_URL_SUFFIX'</span><span>);&nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}<span class="keyword">else</span><span>{&nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$params</span><span>&nbsp;=&nbsp;&nbsp;&nbsp;http_build_query(</span><span class="vars">$params</span><span>);&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>(!</span><span class="func">empty</span><span class="keyword">empty</span><span>(</span><span class="vars">$route</span><span>))&nbsp;{&nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$url</span><span>&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;&nbsp;&nbsp;</span><span class="func">str_replace</span><span>(APP_NAME,</span><span class="vars">$app</span><span>,__APP__).</span><span class="string">'?'</span><span>.C(</span><span class="string">'VAR_ROUTER'</span><span>).</span><span class="string">'='</span><span>.</span><span class="vars">$route</span><span>.</span><span class="string">'&amp;'</span><span>.</span><span class="vars">$params</span><span>;&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<span class="keyword">else</span><span>{&nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$url</span><span>&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;&nbsp;&nbsp;</span><span class="func">str_replace</span><span>(APP_NAME,</span><span class="vars">$app</span><span>,__APP__).</span><span class="string">'?'</span><span>.C(</span><span class="string">'VAR_MODULE'</span><span>).</span><span class="string">'='</span><span>.</span><span class="vars">$module</span><span>.</span><span class="string">'&amp;'</span><span>.C(</span><span class="string">'VAR_ACTION'</span><span>).</span><span class="string">'='</span><span>.</span><span class="vars">$action</span><span>.</span><span class="string">'&amp;'</span><span>.</span><span class="vars">$params</span><span>;&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;</span><span class="vars">$url</span><span>;&nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>}&nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>?&gt;&nbsp;&nbsp;</span></li><br/></ol><br/></div><br/><div class="codeText"><br/><div class="codeHead">PHP代码</div><br/><ol class="dp-c" start="1"><br/>    <li class="alt">&nbsp;</li><br/>    <li class=""><span><span class="keyword">require_once</span><span>&nbsp;</span><span class="string">'functions.php'</span><span>;&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;</span></li><br/>    <li class=""><span><span class="keyword">class</span><span>&nbsp;functionsTest&nbsp;</span><span class="keyword">extends</span><span>&nbsp;PHPUnit_Framework_TestCase&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span>{&nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">/**</span>&nbsp;</span></li><br/>    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;确认url()返回预期的字符串</span>&nbsp;</span></li><br/>    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">function</span><span>&nbsp;testurl()&nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;define(<span class="string">'__APP__'</span><span>,&nbsp;</span><span class="string">'index.php'</span><span>);&nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>&nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;C(<span class="string">'VAR_MODULE'</span><span>,&nbsp;</span><span class="string">'module'</span><span>);&nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;C(<span class="string">'VAR_ACTION'</span><span>,&nbsp;</span><span class="string">'action'</span><span>);&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;C(<span class="string">'VAR_ROUTER'</span><span>,&nbsp;</span><span class="string">'route'</span><span>);&nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>&nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;测试通常模式URL</span><span>&nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$uri</span><span>&nbsp;=&nbsp;url(</span><span class="string">'Index'</span><span>,&nbsp;</span><span class="string">'Home'</span><span>,&nbsp;</span><span class="string">''</span><span>,&nbsp;APP_NAME,&nbsp;</span><span class="keyword">array</span><span>(</span><span class="string">'q'</span><span>&nbsp;=&gt;&nbsp;</span><span class="string">'test'</span><span>,&nbsp;</span><span class="string">'msg'</span><span>&nbsp;=&gt;&nbsp;</span><span class="string">'OK'</span><span>));&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$this</span><span>-&gt;assertEquals(</span><span class="string">'index.php?module=Home&amp;action=Index&amp;q=test&amp;msg=OK'</span><span>,&nbsp;</span><span class="vars">$uri</span><span>);&nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>&nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;测试通常模式路由</span><span>&nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$uri</span><span>&nbsp;=&nbsp;url(</span><span class="string">'Index'</span><span>,&nbsp;</span><span class="string">'Home'</span><span>,&nbsp;</span><span class="string">'default'</span><span>,&nbsp;APP_NAME,&nbsp;</span><span class="keyword">array</span><span>(</span><span class="string">'q'</span><span>&nbsp;=&gt;&nbsp;</span><span class="string">'test'</span><span>,&nbsp;</span><span class="string">'msg'</span><span>&nbsp;=&gt;&nbsp;</span><span class="string">'OK'</span><span>));&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$this</span><span>-&gt;assertEquals(</span><span class="string">'index.php?route=default&amp;q=test&amp;msg=OK'</span><span>,&nbsp;</span><span class="vars">$uri</span><span>);&nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>&nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;C(<span class="string">'DISPATCH_ON'</span><span>,&nbsp;true);&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;C(<span class="string">'URL_MODEL'</span><span>,&nbsp;1);&nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;C(<span class="string">'PATH_MODEL'</span><span>,&nbsp;1);&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;测试普通PATHINFO模式URL</span><span>&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$uri</span><span>&nbsp;=&nbsp;url(</span><span class="string">'Index'</span><span>,&nbsp;</span><span class="string">'Home'</span><span>,&nbsp;</span><span class="string">''</span><span>,&nbsp;APP_NAME,&nbsp;</span><span class="keyword">array</span><span>(</span><span class="string">'q'</span><span>&nbsp;=&gt;&nbsp;</span><span class="string">'test'</span><span>,&nbsp;</span><span class="string">'msg'</span><span>&nbsp;=&gt;&nbsp;</span><span class="string">'OK'</span><span>));&nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$this</span><span>-&gt;assertEquals(</span><span class="string">'index.php/module/Home/action/Index/q/test/msg/OK'</span><span>,&nbsp;</span><span class="vars">$uri</span><span>);&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;测试普通PATHINFO模式路由</span><span>&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$uri</span><span>&nbsp;=&nbsp;url(</span><span class="string">'Index'</span><span>,&nbsp;</span><span class="string">'Home'</span><span>,&nbsp;</span><span class="string">'default'</span><span>,&nbsp;APP_NAME,&nbsp;</span><span class="keyword">array</span><span>(</span><span class="string">'q'</span><span>&nbsp;=&gt;&nbsp;</span><span class="string">'test'</span><span>,&nbsp;</span><span class="string">'msg'</span><span>&nbsp;=&gt;&nbsp;</span><span class="string">'OK'</span><span>));&nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$this</span><span>-&gt;assertEquals(</span><span class="string">'index.php/route/default/q/test/msg/OK'</span><span>,&nbsp;</span><span class="vars">$uri</span><span>);&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;C(<span class="string">'PATH_MODEL'</span><span>,&nbsp;2);&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;C(<span class="string">'PATH_DEPR'</span><span>,&nbsp;</span><span class="string">'/'</span><span>);&nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>&nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;测试智能PATHINFO模式URL</span><span>&nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$uri</span><span>&nbsp;=&nbsp;url(</span><span class="string">'Index'</span><span>,&nbsp;</span><span class="string">'Home'</span><span>,&nbsp;</span><span class="string">''</span><span>,&nbsp;APP_NAME,&nbsp;</span><span class="keyword">array</span><span>(</span><span class="string">'q'</span><span>&nbsp;=&gt;&nbsp;</span><span class="string">'test'</span><span>,&nbsp;</span><span class="string">'msg'</span><span>&nbsp;=&gt;&nbsp;</span><span class="string">'OK'</span><span>));&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$this</span><span>-&gt;assertEquals(</span><span class="string">'index.php/Home/Index/q/test/msg/OK'</span><span>,&nbsp;</span><span class="vars">$uri</span><span>);&nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>&nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;测试智能PATHINFO模式路由</span><span>&nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$uri</span><span>&nbsp;=&nbsp;url(</span><span class="string">'Index'</span><span>,&nbsp;</span><span class="string">'Home'</span><span>,&nbsp;</span><span class="string">'default'</span><span>,&nbsp;APP_NAME,&nbsp;</span><span class="keyword">array</span><span>(</span><span class="string">'q'</span><span>&nbsp;=&gt;&nbsp;</span><span class="string">'test'</span><span>,&nbsp;</span><span class="string">'msg'</span><span>&nbsp;=&gt;&nbsp;</span><span class="string">'OK'</span><span>));&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$this</span><span>-&gt;assertEquals(</span><span class="string">'index.php/default/q/test/msg/OK'</span><span>,&nbsp;</span><span class="vars">$uri</span><span>);&nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>}&nbsp;&nbsp;</span></li><br/>    <li class=""><span>?&gt;&nbsp;&nbsp;</span></li><br/></ol><br/></div><br/><p><strong>异常测试</strong><br /><br/>有时程序执行了非法操作而抛出异常，我们需要模拟某个异常，然后捕捉它是否触发了该异常。</p><br/><div class="codeText"><br/><div class="codeHead">PHP代码</div><br/><ol class="dp-c" start="1"><br/>    <li class="alt">&nbsp;</li><br/>    <li class=""><span><span class="keyword">class</span><span>&nbsp;UnitTest&nbsp;</span><span class="keyword">extends</span><span>&nbsp;PHPUnit_Framework_TestCase&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span>{&nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">/**</span>&nbsp;</span></li><br/>    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;测试异常</span>&nbsp;</span></li><br/>    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">function</span><span>&nbsp;testException()&nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;期望Exception异常</span><span>&nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$this</span><span>-&gt;setExpectedException(</span><span class="string">'Exception'</span><span>);&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;抛出Exception异常</span><span>&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">throw</span><span>&nbsp;</span><span class="keyword">new</span><span>&nbsp;Exception(</span><span class="string">'TestException'</span><span>);&nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>}&nbsp;&nbsp;</span></li><br/>    <li class=""><span>?&gt;&nbsp;&nbsp;</span></li><br/></ol><br/></div><br/><p><strong>输出测试</strong><br /><br/>有时某个方法并不返回而输出某些内容，我们需要继承PHPUnit_Extensions_OutputTestCase类来捕捉输出内容。PHPUnit默认不载入扩展类，需要自己加载。</p><br/><div class="codeText"><br/><div class="codeHead">PHP代码</div><br/><ol class="dp-c" start="1"><br/>    <li class="alt">&nbsp;</li><br/>    <li class=""><span><span class="comment">//&nbsp;载入输出测试用例扩展</span><span>&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span><span class="keyword">require_once</span><span>&nbsp;</span><span class="string">'PHPUnit/Extensions/OutputTestCase.php'</span><span>;&nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>&nbsp;&nbsp;</span></li><br/>    <li class="alt"><span><span class="keyword">class</span><span>&nbsp;UnitTest&nbsp;</span><span class="keyword">extends</span><span>&nbsp;PHPUnit_Extensions_OutputTestCase&nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>{&nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">/**</span>&nbsp;</span></li><br/>    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;测试输出</span>&nbsp;</span></li><br/>    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">function</span><span>&nbsp;testOutput()&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;期望输出的内容是字符串&nbsp;'Hello'</span><span>&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$this</span><span>-&gt;expectOutputString(</span><span class="string">'Hello'</span><span>);&nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>&nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;输出&nbsp;'Hello'</span><span>&nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="func">echo</span><span>&nbsp;</span><span class="string">'Hello'</span><span>;&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><br/>    <li class=""><span>}&nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>?&gt;&nbsp;&nbsp;</span></li><br/></ol><br/></div><br/><p><strong>数据库测试</strong><br /><br/>PHPUnit的数据库测试并不完善，只提供了assertTablesEqual和assertDataSetsEqual两个断言与createFlatXMLDataSet和createXMLDataSet创建XML数据集的方法。无法进行全面的数据操作测试，建议使用DBUnit。</p><br/><p><strong>附录</strong><br /><br/>PHPUnit断言参考<br /><br/>assertArrayHasKey($key, array $array, $message = '')<br /><br/>assertArrayNotHasKey($key, array $array, $message = '')<br /><br/>assertAttributeContains($needle, $haystackAttributeName, $haystackClassOrObject, $message = '')<br /><br/>assertAttributeContainsOnly($type, $haystackAttributeName, $haystackClassOrObject, $isNativeType = NULL, $message = '')<br /><br/>assertAttributeEquals($expected, $actualAttributeName, $actualClassOrObject, $message = '', $delta = 0, $maxDepth = 10, $canonicalizeEol = FALSE)<br /><br/>assertAttributeGreaterThan($expected, $actualAttributeName, $actualClassOrObject, $message = '')<br /><br/>assertAttributeGreaterThanOrEqual($expected, $actualAttributeName, $actualClassOrObject, $message = '')<br /><br/>assertAttributeLessThan($expected, $actualAttributeName, $actualClassOrObject, $message = '')<br /><br/>assertAttributeLessThanOrEqual($expected, $actualAttributeName, $actualClassOrObject, $message = '')<br /><br/>assertAttributeNotContains($needle, $haystackAttributeName, $haystackClassOrObject, $message = '')<br /><br/>assertAttributeNotContainsOnly($type, $haystackAttributeName, $haystackClassOrObject, $isNativeType = NULL, $message = '')<br /><br/>assertAttributeNotEquals($expected, $actualAttributeName, $actualClassOrObject, $message = '', $delta = 0, $maxDepth = 10, $canonicalizeEol = FALSE)<br /><br/>assertAttributeNotSame($expected, $actualAttributeName, $actualClassOrObject, $message = '')<br /><br/>assertAttributeSame($expected, $actualAttributeName, $actualClassOrObject, $message = '')<br /><br/>assertClassHasAttribute($attributeName, $className, $message = '')<br /><br/>assertClassHasStaticAttribute($attributeName, $className, $message = '')<br /><br/>assertClassNotHasAttribute($attributeName, $className, $message = '')<br /><br/>assertClassNotHasStaticAttribute($attributeName, $className, $message = '')<br /><br/>assertContains($needle, $haystack, $message = '')<br /><br/>assertContainsOnly($type, $haystack, $isNativeType = NULL, $message = '')<br /><br/>assertEqualXMLStructure(DOMNode $expectedNode, DOMNode $actualNode, $checkAttributes = FALSE, $message = '')<br /><br/>assertEquals($expected, $actual, $message = '', $delta = 0, $maxDepth = 10, $canonicalizeEol = FALSE)<br /><br/>assertFalse($condition, $message = '')<br /><br/>assertFileEquals($expected, $actual, $message = '', $canonicalizeEol = FALSE)</p><br/><p>PHPUnit官方文档<br /><br/><a href="http://www.phpunit.de/manual/3.3/en/index.html">http://www.phpunit.de/manual/3.3/en/index.html</a></p>]]></description>
   <link>http://thinkphp.cn/Blog/24</link>
   <pubDate>Thu, 15 Jan 2009 14:36:58 +0800</pubDate>
  </item>
  <item>
   <title>使用单元测试工具</title>
   <description><![CDATA[<p><strong>敏捷开发思想</strong></p><br/><p>首先，编写类定义；<br /><br/>其次，编写测试用例；<br /><br/>第三，实现类；<br /><br/>第四，实现测试用例；<br /><br/>第五，反复测试修改。</p><br/><p></p><br/><p><strong>准备工作</strong></p><br/><p>安装PHPUnit</p><br/><p>自动安装<br /><br/>pear install phpunit</p><br/><p>手动安装<br /><br/>下载<a href="http://pear.phpunit.de/get/PHPUnit-3.3.9.tgz">http://pear.phpunit.de/get/PHPUnit-3.3.9.tgz</a>，解压到PHP目录，</p><br/><p>将pear-phpunit和pear-phpunit.bat，复制到PHP目录，重命名为phpunit和phpunit.bat，将PHP目录加入PATH路径。</p><br/><p>编辑phpunit，修改为：</p><br/><div class="codeText"><br/><div class="codeHead">PHP代码</div><br/><ol class="dp-c"><br/>    <li class="alt"><span><span>#!&nbsp;php&nbsp;-d&nbsp;safe_mode=Off &nbsp;&nbsp;</span></span></li><br/>    <li class=""><span><!--p   </sp--></span></li><br/>    <li class="alt"><span>set_include_path(dirname(</span><span class="keyword">__FILE__</span><span>)&nbsp;.&nbsp;DIRECTORY_SEPARATOR&nbsp;.&nbsp;</span><span class="string">'PHPUnit-3.3.9'</span><span>&nbsp;.&nbsp;PATH_SEPARATOR&nbsp;.&nbsp;get_include_path()); &nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;</span></li><br/>    <li class="alt"><span class="keyword">require_once</span><span>&nbsp;</span><span class="string">'PHPUnit/Util/Filter.php'</span><span>; &nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>PHPUnit_Util_Filter::addFileToFilter(</span><span class="keyword">__FILE__</span><span>,&nbsp;</span><span class="string">'PHPUNIT'</span><span>); &nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;</span></li><br/>    <li class="alt"><span class="keyword">require</span><span>&nbsp;</span><span class="string">'PHPUnit/TextUI/Command.php'</span><span>; &nbsp;&nbsp;</span></li><br/>    <li class=""><span>?&gt;&nbsp;&nbsp;</span></li><br/></ol><br/></div><br/><p><br /><br/>编辑phpunit.bat，假设PHP路径为D:\PHP，修改为：<br /><br/>@echo off<br /><br/>php -d safe_mode=Off D:\PHP\phpunit %*</p><br/><p>现在在终端运行phpunit，看看命令参数。</p><br/><p><img src="http://thinkphp.cn/Public/Uploads/496bffe20b685.jpg" alt="" /></p><br/><p><strong>单元测试实践</strong></p><br/><p>编写类定义</p><br/><div class="codeText"><br/><div class="codeHead">PHP代码</div><br/><ol class="dp-c"><br/>    <li class="alt"><span><span><!--p   </sp--></span></span></li><br/>    <li class=""><span class="comment">/** </span>&nbsp;</li><br/>    <li class="alt"><span><span class="comment">&nbsp;*&nbsp;计算器类 </span>&nbsp;</span></li><br/>    <li class=""><span><span class="comment">&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span class="keyword">class</span><span>&nbsp;Calculator &nbsp;&nbsp;</span></li><br/>    <li class=""><span>{ &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">/** </span>&nbsp;</li><br/>    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;加法运算 </span>&nbsp;</span></li><br/>    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* </span>&nbsp;</span></li><br/>    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@access&nbsp;public </span>&nbsp;</span></li><br/>    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">function</span><span>&nbsp;add() &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">/** </span>&nbsp;</li><br/>    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;乘法运算 </span>&nbsp;</span></li><br/>    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* </span>&nbsp;</span></li><br/>    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@access&nbsp;public </span>&nbsp;</span></li><br/>    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">function</span><span>&nbsp;multiply() &nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li><br/>    <li class=""><span>} &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>?&gt;&nbsp;&nbsp;</span></li><br/></ol><br/></div><br/><p><!--p<br--></p><br/><p>编写测试用例&nbsp;</p><br/><div class="codeText"><br/><div class="codeHead">PHP代码</div><br/><ol class="dp-c"><br/>    <li class="alt"><span><span><!--p   </sp--></span></span></li><br/>    <li class=""><span class="keyword">require_once</span><span>&nbsp;</span><span class="string">'Calculator.php'</span><span>; &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;</span></li><br/>    <li class=""><span class="comment">/** </span>&nbsp;</li><br/>    <li class="alt"><span><span class="comment">&nbsp;*&nbsp;计算器测试用例 </span>&nbsp;</span></li><br/>    <li class=""><span><span class="comment">&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span class="keyword">class</span><span>&nbsp;CalculatorTest&nbsp;</span><span class="keyword">extends</span><span>&nbsp;PHPUnit_Framework_TestCase &nbsp;&nbsp;</span></li><br/>    <li class=""><span>{ &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">/** </span>&nbsp;</li><br/>    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@var&nbsp;&nbsp;&nbsp;&nbsp;object </span>&nbsp;</span></li><br/>    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@access&nbsp;protected </span>&nbsp;</span></li><br/>    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">protected</span><span>&nbsp;</span><span class="vars">$object</span><span>; &nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">/** </span>&nbsp;</li><br/>    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;建立测试，在测试方法执行前被调用 </span>&nbsp;</span></li><br/>    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* </span>&nbsp;</span></li><br/>    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@access&nbsp;protected </span>&nbsp;</span></li><br/>    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">protected</span><span>&nbsp;</span><span class="keyword">function</span><span>&nbsp;setUp() &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;object&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;Calculator(); &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">/** </span>&nbsp;</li><br/>    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;拆除测试，在测试方法执行后被调用 </span>&nbsp;</span></li><br/>    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* </span>&nbsp;</span></li><br/>    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@access&nbsp;protected </span>&nbsp;</span></li><br/>    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">protected</span><span>&nbsp;</span><span class="keyword">function</span><span>&nbsp;tearDown() &nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">/** </span>&nbsp;</li><br/>    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;测试加法运算 </span>&nbsp;</span></li><br/>    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* </span>&nbsp;</span></li><br/>    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@access&nbsp;public </span>&nbsp;</span></li><br/>    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">function</span><span>&nbsp;testadd() &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">/** </span>&nbsp;</li><br/>    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;测试乘法运算 </span>&nbsp;</span></li><br/>    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* </span>&nbsp;</span></li><br/>    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@access&nbsp;public </span>&nbsp;</span></li><br/>    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">function</span><span>&nbsp;testmultiply() &nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li><br/>    <li class=""><span>} &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>?&gt;&nbsp;&nbsp;</span></li><br/></ol><br/></div><br/><p>实现类&nbsp;</p><br/><div class="codeText"><br/><div class="codeHead">PHP代码</div><br/><ol class="dp-c"><br/>    <li class="alt"><span><span><!--p   </sp--></span></span></li><br/>    <li class=""><span class="comment">/** </span>&nbsp;</li><br/>    <li class="alt"><span><span class="comment">&nbsp;*&nbsp;计算器类 </span>&nbsp;</span></li><br/>    <li class=""><span><span class="comment">&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span class="keyword">class</span><span>&nbsp;Calculator &nbsp;&nbsp;</span></li><br/>    <li class=""><span>{ &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">/** </span>&nbsp;</li><br/>    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;加法运算 </span>&nbsp;</span></li><br/>    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* </span>&nbsp;</span></li><br/>    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;&nbsp;int&nbsp;&nbsp;$a </span>&nbsp;</span></li><br/>    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;&nbsp;int&nbsp;&nbsp;$b </span>&nbsp;</span></li><br/>    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@access&nbsp;public </span>&nbsp;</span></li><br/>    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">function</span><span>&nbsp;add(</span><span class="vars">$a</span><span>,&nbsp;</span><span class="vars">$b</span><span>) &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="vars">$a</span><span>&nbsp;+&nbsp;</span><span class="vars">$b</span><span>; &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">/** </span>&nbsp;</li><br/>    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;乘法运算 </span>&nbsp;</span></li><br/>    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* </span>&nbsp;</span></li><br/>    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;&nbsp;int&nbsp;&nbsp;$a </span>&nbsp;</span></li><br/>    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;&nbsp;int&nbsp;&nbsp;$b </span>&nbsp;</span></li><br/>    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@access&nbsp;public </span>&nbsp;</span></li><br/>    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">function</span><span>&nbsp;multiply(</span><span class="vars">$a</span><span>,&nbsp;</span><span class="vars">$b</span><span>) &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="vars">$a</span><span>&nbsp;*&nbsp;</span><span class="vars">$b</span><span>; &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li><br/>    <li class=""><span>} &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>?&gt;&nbsp;&nbsp;</span></li><br/></ol><br/></div><br/><p>实现测试用例&nbsp;</p><br/><div class="codeText"><br/><div class="codeHead">PHP代码</div><br/><ol class="dp-c"><br/>    <li class="alt"><span><span><!--p   </sp--></span></span></li><br/>    <li class=""><span class="keyword">require_once</span><span>&nbsp;</span><span class="string">'Calculator.php'</span><span>; &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;</span></li><br/>    <li class=""><span class="comment">/** </span>&nbsp;</li><br/>    <li class="alt"><span><span class="comment">&nbsp;*&nbsp;计算器测试用例 </span>&nbsp;</span></li><br/>    <li class=""><span><span class="comment">&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span class="keyword">class</span><span>&nbsp;CalculatorTest&nbsp;</span><span class="keyword">extends</span><span>&nbsp;PHPUnit_Framework_TestCase &nbsp;&nbsp;</span></li><br/>    <li class=""><span>{ &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">/** </span>&nbsp;</li><br/>    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@var&nbsp;&nbsp;&nbsp;&nbsp;object </span>&nbsp;</span></li><br/>    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@access&nbsp;protected </span>&nbsp;</span></li><br/>    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">protected</span><span>&nbsp;</span><span class="vars">$object</span><span>; &nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">/** </span>&nbsp;</li><br/>    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;建立测试，在测试方法执行前被调用 </span>&nbsp;</span></li><br/>    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* </span>&nbsp;</span></li><br/>    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@access&nbsp;protected </span>&nbsp;</span></li><br/>    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">protected</span><span>&nbsp;</span><span class="keyword">function</span><span>&nbsp;setUp() &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;object&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;Calculator(); &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">/** </span>&nbsp;</li><br/>    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;拆除测试，在测试方法执行后被调用 </span>&nbsp;</span></li><br/>    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* </span>&nbsp;</span></li><br/>    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@access&nbsp;protected </span>&nbsp;</span></li><br/>    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">protected</span><span>&nbsp;</span><span class="keyword">function</span><span>&nbsp;tearDown() &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">/** </span>&nbsp;</li><br/>    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;测试加法运算 </span>&nbsp;</span></li><br/>    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* </span>&nbsp;</span></li><br/>    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@access&nbsp;public </span>&nbsp;</span></li><br/>    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">function</span><span>&nbsp;testadd() &nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$expected</span><span>&nbsp;=&nbsp;2; &nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$result</span><span>&nbsp;=&nbsp;</span><span class="vars">$this</span><span>-&gt;object-&gt;add(1,&nbsp;1); &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;assertEquals(</span><span class="vars">$expected</span><span>,&nbsp;</span><span class="vars">$result</span><span>); &nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">/** </span>&nbsp;</li><br/>    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;测试乘法运算 </span>&nbsp;</span></li><br/>    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* </span>&nbsp;</span></li><br/>    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@access&nbsp;public </span>&nbsp;</span></li><br/>    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">function</span><span>&nbsp;testmultiply() &nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$expected</span><span>&nbsp;=&nbsp;4; &nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$result</span><span>&nbsp;=&nbsp;</span><span class="vars">$this</span><span>-&gt;object-&gt;multiply(2,&nbsp;2); &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;assertEquals(</span><span class="vars">$expected</span><span>,&nbsp;</span><span class="vars">$result</span><span>); &nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>} &nbsp;&nbsp;</span></li><br/>    <li class=""><span>?&gt;&nbsp;&nbsp;</span></li><br/></ol><br/></div><br/><p>执行测试<br /><br/>phpunit CalculatorTest.php</p><br/><p><img src="http://thinkphp.cn/Public/Uploads/496c00adcb102.jpg" alt="" /></p><br/><p><strong>进阶</strong></p><br/><p>一些方法和属性被声明为保护类型，我们在测试无返回值或被保护的方法时，继承就能解决问题。为什么要测试被保护方法？我个人认为由于PHP是一种语法宽松的语言，因而必须进行更严格的测试，要从最底层确保方法的正确性。如果必要的话，也可以测试私有方法。&nbsp;</p><br/><div class="codeText"><br/><div class="codeHead">PHP代码</div><br/><ol class="dp-c"><br/>    <li class="alt"><span><span><!--p   </sp--></span></span></li><br/>    <li class=""><span class="comment">/** </span>&nbsp;</li><br/>    <li class="alt"><span><span class="comment">&nbsp;*&nbsp;计算器类 </span>&nbsp;</span></li><br/>    <li class=""><span><span class="comment">&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span class="keyword">class</span><span>&nbsp;Calculator &nbsp;&nbsp;</span></li><br/>    <li class=""><span>{ &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">/** </span>&nbsp;</li><br/>    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;加法运算 </span>&nbsp;</span></li><br/>    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* </span>&nbsp;</span></li><br/>    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;&nbsp;int&nbsp;&nbsp;$a </span>&nbsp;</span></li><br/>    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;&nbsp;int&nbsp;&nbsp;$b </span>&nbsp;</span></li><br/>    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@access&nbsp;protected </span>&nbsp;</span></li><br/>    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">protected</span><span>&nbsp;</span><span class="keyword">function</span><span>&nbsp;add(</span><span class="vars">$a</span><span>,&nbsp;</span><span class="vars">$b</span><span>) &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="vars">$a</span><span>&nbsp;+&nbsp;</span><span class="vars">$b</span><span>; &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">/** </span>&nbsp;</li><br/>    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;乘法运算 </span>&nbsp;</span></li><br/>    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* </span>&nbsp;</span></li><br/>    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;&nbsp;int&nbsp;&nbsp;$a </span>&nbsp;</span></li><br/>    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;&nbsp;int&nbsp;&nbsp;$b </span>&nbsp;</span></li><br/>    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@access&nbsp;protected </span>&nbsp;</span></li><br/>    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">protected</span><span>&nbsp;</span><span class="keyword">function</span><span>&nbsp;multiply(</span><span class="vars">$a</span><span>,&nbsp;</span><span class="vars">$b</span><span>) &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="vars">$a</span><span>&nbsp;*&nbsp;</span><span class="vars">$b</span><span>; &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li><br/>    <li class=""><span>} &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>?&gt;&nbsp;&nbsp;</span></li><br/></ol><br/></div><br/><p>使用继承来测试被保护方法。&nbsp;</p><br/><div class="codeText"><br/><div class="codeHead">PHP代码</div><br/><ol class="dp-c"><br/>    <li class="alt"><span><span><!--p   </sp--></span></span></li><br/>    <li class=""><span class="keyword">require_once</span><span>&nbsp;</span><span class="string">'Calculator.php'</span><span>; &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;</span></li><br/>    <li class=""><span class="keyword">class</span><span>&nbsp;MyCalculator&nbsp;</span><span class="keyword">extends</span><span>&nbsp;Calculator &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>{ &nbsp;&nbsp;</span></li><br/>    <li class=""><span>} &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;</span></li><br/>    <li class=""><span class="comment">/** </span>&nbsp;</li><br/>    <li class="alt"><span><span class="comment">&nbsp;*&nbsp;计算器测试用例 </span>&nbsp;</span></li><br/>    <li class=""><span><span class="comment">&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span class="keyword">class</span><span>&nbsp;CalculatorTest&nbsp;</span><span class="keyword">extends</span><span>&nbsp;PHPUnit_Framework_TestCase &nbsp;&nbsp;</span></li><br/>    <li class=""><span>{ &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">/** </span>&nbsp;</li><br/>    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@var&nbsp;&nbsp;&nbsp;&nbsp;object </span>&nbsp;</span></li><br/>    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@access&nbsp;protected </span>&nbsp;</span></li><br/>    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">protected</span><span>&nbsp;</span><span class="vars">$object</span><span>; &nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">/** </span>&nbsp;</li><br/>    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;建立测试，在测试方法执行前被调用 </span>&nbsp;</span></li><br/>    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* </span>&nbsp;</span></li><br/>    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@access&nbsp;protected </span>&nbsp;</span></li><br/>    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">protected</span><span>&nbsp;</span><span class="keyword">function</span><span>&nbsp;setUp() &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;object&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;MyCalculator(); &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">/** </span>&nbsp;</li><br/>    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;拆除测试，在测试方法执行后被调用 </span>&nbsp;</span></li><br/>    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* </span>&nbsp;</span></li><br/>    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@access&nbsp;protected </span>&nbsp;</span></li><br/>    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">protected</span><span>&nbsp;</span><span class="keyword">function</span><span>&nbsp;tearDown() &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">/** </span>&nbsp;</li><br/>    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;测试加法运算 </span>&nbsp;</span></li><br/>    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* </span>&nbsp;</span></li><br/>    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@access&nbsp;public </span>&nbsp;</span></li><br/>    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">function</span><span>&nbsp;testadd() &nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$expected</span><span>&nbsp;=&nbsp;2; &nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$result</span><span>&nbsp;=&nbsp;</span><span class="vars">$this</span><span>-&gt;object-&gt;add(1,&nbsp;1); &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;assertEquals(</span><span class="vars">$expected</span><span>,&nbsp;</span><span class="vars">$result</span><span>); &nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">/** </span>&nbsp;</li><br/>    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;测试乘法运算 </span>&nbsp;</span></li><br/>    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* </span>&nbsp;</span></li><br/>    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@access&nbsp;public </span>&nbsp;</span></li><br/>    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">function</span><span>&nbsp;testmultiply() &nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$expected</span><span>&nbsp;=&nbsp;4; &nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$result</span><span>&nbsp;=&nbsp;</span><span class="vars">$this</span><span>-&gt;object-&gt;multiply(2,&nbsp;2); &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;assertEquals(</span><span class="vars">$expected</span><span>,&nbsp;</span><span class="vars">$result</span><span>); &nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>} &nbsp;&nbsp;</span></li><br/>    <li class=""><span>?&gt;&nbsp;&nbsp;</span></li><br/></ol><br/></div><br/><p>编写总测试套件</p><br/><div class="codeText"><br/><div class="codeHead">PHP代码</div><br/><ol class="dp-c"><br/>    <li class="alt"><span><span>&lt;? &nbsp;&nbsp;</span></span></li><br/>    <li class=""><span class="comment">//&nbsp;设置错误报告为严格等级 </span><span>&nbsp;&nbsp;</span></li><br/>    <li class="alt"><span class="func">error_reporting</span><span>(E_ALL&nbsp;|&nbsp;E_STRICT); &nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;</span></li><br/>    <li class="alt"><span class="comment">//&nbsp;测试配置文件 </span><span>&nbsp;&nbsp;</span></li><br/>    <li class=""><span class="keyword">require</span><span>&nbsp;</span><span class="string">'Configure.php'</span><span>; &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;</span></li><br/>    <li class=""><span class="comment">//&nbsp;Require&nbsp;PHPUnit </span><span>&nbsp;&nbsp;</span></li><br/>    <li class="alt"><span class="keyword">require_once</span><span>&nbsp;</span><span class="string">'PHPUnit/Util/Filter.php'</span><span>; &nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>PHPUnit_Util_Filter::addFileToFilter(</span><span class="keyword">__FILE__</span><span>); &nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;</span></li><br/>    <li class="alt"><span class="keyword">require_once</span><span>&nbsp;</span><span class="string">'PHPUnit/Framework/TestSuite.php'</span><span>; &nbsp;&nbsp;</span></li><br/>    <li class=""><span class="keyword">require_once</span><span>&nbsp;</span><span class="string">'PHPUnit/Extensions/PhptTestSuite.php'</span><span>; &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;</span></li><br/>    <li class=""><span class="comment">//&nbsp;Require&nbsp;test&nbsp;suites </span><span>&nbsp;&nbsp;</span></li><br/>    <li class="alt"><span class="keyword">require_once</span><span>&nbsp;</span><span class="string">'Math/AllTests.php'</span><span>; &nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;</span></li><br/>    <li class="alt"><span class="keyword">class</span><span>&nbsp;AllTests &nbsp;&nbsp;</span></li><br/>    <li class=""><span>{ &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">function</span><span>&nbsp;suite() &nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$suite</span><span>&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;PHPUnit_Framework_TestSuite(</span><span class="string">'MyProject'</span><span>); &nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$suite</span><span>-&gt;addTest(Math_AllTests::suite()); &nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="vars">$suite</span><span>; &nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>} &nbsp;&nbsp;</span></li><br/>    <li class=""><span>?&gt;&nbsp;&nbsp;</span></li><br/></ol><br/></div><br/><p><span><br/><p>编写支测试套件</p><br/><div class="codeText"><br/><div class="codeHead">PHP代码</div><br/><ol class="dp-c"><br/>    <li class="alt"><span><span><!--p   </sp--></span></span></li><br/>    <li class=""><span class="comment">//&nbsp;Require&nbsp;test&nbsp;suites </span><span>&nbsp;&nbsp;</span></li><br/>    <li class="alt"><span class="keyword">require_once</span><span>&nbsp;</span><span class="string">'Math/CalculatorTest.php'</span><span>; &nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;</span></li><br/>    <li class="alt"><span class="keyword">class</span><span>&nbsp;Math_AllTests &nbsp;&nbsp;</span></li><br/>    <li class=""><span>{ &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">function</span><span>&nbsp;suite() &nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$suite</span><span>&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;PHPUnit_Framework_TestSuite(</span><span class="string">'Math'</span><span>); &nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$suite</span><span>-&gt;addTestSuite(</span><span class="string">'Math_CalculatorTest'</span><span>); &nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="vars">$suite</span><span>; &nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>} &nbsp;&nbsp;</span></li><br/>    <li class=""><span>?&gt;&nbsp;&nbsp;</span></li><br/></ol><br/></div><br/><p>注意：测试用例这里采用目录名加下划线再加原来的测试用例名，来避免不同目录的同名类冲突问题。</p><br/><p>目录结构<br /><br/>Lib<br /><br/>+- Math<br /><br/>&nbsp;&nbsp; +- Calculator.php<br /><br/>Tests<br /><br/>+- Math<br /><br/>&nbsp;&nbsp;&nbsp; +- AllTests.php<br /><br/>&nbsp;&nbsp;&nbsp; +- CalculatorTest.php<br /><br/>|- AllTests.php<br /><br/>|- Configure.php</p><br/><p>执行所有测试<br /><br/>phpunit --verbose AllTests.php</p><br/><p><img src="http://thinkphp.cn/Public/Uploads/496c00b3e46e9.jpg" alt="" /></p><br/><p>备注：phpunit命令可以直接使用不带.php的名称或目录，例如，<br /><br/>phpunit CalculatorTest<br /><br/>phpunit Math<br /><br/>但是这里建议您在每个目录下都写一个测试套件AllTests.php文件，这么做可以为后期测试节省许多时间。因为如果你的项目中有几十个甚至上百个文件或者目录结构很深，将导致PHP脚本超出内存的错误，而且phpunit每次都需要花很长的时间来生成测试套件。</p><br/><p><strong>自动化测试</strong></p><br/><p>自动生成测试用例<br /><br/>phpunit --skeleton Calculator.php</p><br/><p>该命令会生成一个CalculatorTest.php的测试用例，里面有两个未完成的测试方法testAdd()和testMultiply()，你需要完善它。</p><br/><div class="codeText"><br/><div class="codeHead">PHP代码</div><br/><ol class="dp-c"><br/>    <li class="alt"><span><span><!--p   </sp--></span></span></li><br/>    <li class=""><span class="keyword">require_once</span><span>&nbsp;</span><span class="string">'PHPUnit/Framework.php'</span><span>; &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;</span></li><br/>    <li class=""><span class="keyword">require_once</span><span>&nbsp;</span><span class="string">'Calculator.php'</span><span>; &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;</span></li><br/>    <li class=""><span class="comment">/** </span>&nbsp;</li><br/>    <li class="alt"><span><span class="comment">&nbsp;*&nbsp;Test&nbsp;class&nbsp;for&nbsp;Calculator. </span>&nbsp;</span></li><br/>    <li class=""><span><span class="comment">&nbsp;*&nbsp;Generated&nbsp;by&nbsp;PHPUnit&nbsp;on&nbsp;2009-01-13&nbsp;at&nbsp;09:30:46. </span>&nbsp;</span></li><br/>    <li class="alt"><span><span class="comment">&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li><br/>    <li class=""><span class="keyword">class</span><span>&nbsp;CalculatorTest&nbsp;</span><span class="keyword">extends</span><span>&nbsp;PHPUnit_Framework_TestCase &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>{ &nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">/** </span>&nbsp;</li><br/>    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@var&nbsp;&nbsp;&nbsp;&nbsp;Calculator </span>&nbsp;</span></li><br/>    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@access&nbsp;protected </span>&nbsp;</span></li><br/>    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">protected</span><span>&nbsp;</span><span class="vars">$object</span><span>; &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">/** </span>&nbsp;</li><br/>    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Sets&nbsp;up&nbsp;the&nbsp;fixture,&nbsp;for&nbsp;example,&nbsp;opens&nbsp;a&nbsp;network&nbsp;connection. </span>&nbsp;</span></li><br/>    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;This&nbsp;method&nbsp;is&nbsp;called&nbsp;before&nbsp;a&nbsp;test&nbsp;is&nbsp;executed. </span>&nbsp;</span></li><br/>    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* </span>&nbsp;</span></li><br/>    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@access&nbsp;protected </span>&nbsp;</span></li><br/>    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">protected</span><span>&nbsp;</span><span class="keyword">function</span><span>&nbsp;setUp() &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;object&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;Calculator; &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">/** </span>&nbsp;</li><br/>    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Tears&nbsp;down&nbsp;the&nbsp;fixture,&nbsp;for&nbsp;example,&nbsp;closes&nbsp;a&nbsp;network&nbsp;connection. </span>&nbsp;</span></li><br/>    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;This&nbsp;method&nbsp;is&nbsp;called&nbsp;after&nbsp;a&nbsp;test&nbsp;is&nbsp;executed. </span>&nbsp;</span></li><br/>    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* </span>&nbsp;</span></li><br/>    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@access&nbsp;protected </span>&nbsp;</span></li><br/>    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">protected</span><span>&nbsp;</span><span class="keyword">function</span><span>&nbsp;tearDown() &nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">/** </span>&nbsp;</li><br/>    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@todo&nbsp;Implement&nbsp;testAdd(). </span>&nbsp;</span></li><br/>    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">function</span><span>&nbsp;testAdd()&nbsp;{ &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;Remove&nbsp;the&nbsp;following&nbsp;lines&nbsp;when&nbsp;you&nbsp;implement&nbsp;this&nbsp;test. </span><span>&nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;markTestIncomplete( &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="string">'This&nbsp;test&nbsp;has&nbsp;not&nbsp;been&nbsp;implemented&nbsp;yet.'</span><span>&nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;); &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">/** </span>&nbsp;</li><br/>    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@todo&nbsp;Implement&nbsp;testMultiply(). </span>&nbsp;</span></li><br/>    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">function</span><span>&nbsp;testMultiply()&nbsp;{ &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;Remove&nbsp;the&nbsp;following&nbsp;lines&nbsp;when&nbsp;you&nbsp;implement&nbsp;this&nbsp;test. </span><span>&nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;markTestIncomplete( &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="string">'This&nbsp;test&nbsp;has&nbsp;not&nbsp;been&nbsp;implemented&nbsp;yet.'</span><span>&nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;); &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li><br/>    <li class=""><span>} &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>?&gt;&nbsp;&nbsp;</span></li><br/></ol><br/></div><br/><p><strong>持续集成</strong></p><br/><p>如果你需要与其他项目集成或集成到IDE工具中，使用ant构建是个不错的注意。<br /><br/>编写ant构建文件，让构建、测试、报告、清理一部到位。你可以将下面内容加入你的build.xml文件中。</p><br/><div class="codeText"><br/><div class="codeHead">XML/HTML代码</div><br/><ol class="dp-xml"><br/>    <li class="alt"><span><span class="tag"><!--sp--><span class="tag-name">xml</span><span>&nbsp;</span><span class="attribute">version</span><span>=</span><span class="attribute-value">&quot;1.0&quot;</span><span>&nbsp;</span><span class="attribute">encoding</span><span>=</span><span class="attribute-value">&quot;utf-8&quot;</span><span class="tag">?&gt;</span><span>&nbsp;&nbsp;</span></span> </span></li><br/>    <li class=""><span class="tag">&lt;</span><span class="tag-name">project</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;MyProject&quot;</span><span>&nbsp;</span><span class="attribute">default</span><span>=</span><span class="attribute-value">&quot;test&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;docs&quot;</span><span>&nbsp;</span><span class="attribute">location</span><span>=</span><span class="attribute-value">&quot;Docs&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;report&quot;</span><span>&nbsp;</span><span class="attribute">location</span><span>=</span><span class="attribute-value">&quot;Docs/Report&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">target</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;prepare&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">mkdir</span><span>&nbsp;</span><span class="attribute">dir</span><span>=</span><span class="attribute-value">&quot;${docs}&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">mkdir</span><span>&nbsp;</span><span class="attribute">dir</span><span>=</span><span class="attribute-value">&quot;${report}&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;</span><span class="tag"><span class="tag-name">target</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li><br/>    <li class=""><span>&nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">target</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;test&quot;</span><span>&nbsp;</span><span class="attribute">depends</span><span>=</span><span class="attribute-value">&quot;prepare&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">exec</span><span>&nbsp;</span><span class="attribute">dir</span><span>=</span><span class="attribute-value">&quot;${basedir}&quot;</span><span>&nbsp;</span><span class="attribute">executable</span><span>=</span><span class="attribute-value">&quot;phpunit&quot;</span><span>&nbsp;</span><span class="attribute">failonerror</span><span>=</span><span class="attribute-value">&quot;true&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">arg</span><span>&nbsp;</span><span class="attribute">line</span><span>=</span><span class="attribute-value">&quot;--log-tap&nbsp;${docs}/log.txt&nbsp;--log-xml&nbsp;${docs}/log.xml&nbsp;--testdox-html&nbsp;${docs}/test.html&nbsp;--testdox-text&nbsp;${docs}/test.txt&nbsp;AllTests.php&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag"><span class="tag-name">exec</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;</span><span class="tag"><span class="tag-name">target</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li><br/>    <li class=""><span>&nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">target</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;report&quot;</span><span>&nbsp;</span><span class="attribute">depends</span><span>=</span><span class="attribute-value">&quot;prepare&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">exec</span><span>&nbsp;</span><span class="attribute">dir</span><span>=</span><span class="attribute-value">&quot;${basedir}&quot;</span><span>&nbsp;</span><span class="attribute">executable</span><span>=</span><span class="attribute-value">&quot;phpunit&quot;</span><span>&nbsp;</span><span class="attribute">failonerror</span><span>=</span><span class="attribute-value">&quot;true&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">arg</span><span>&nbsp;</span><span class="attribute">line</span><span>=</span><span class="attribute-value">&quot;--coverage-html&nbsp;${report}&nbsp;AllTests.php&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag"><span class="tag-name">exec</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;</span><span class="tag"><span class="tag-name">target</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li><br/>    <li class=""><span>&nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">target</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;clean&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li><br/>    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">delete</span><span>&nbsp;</span><span class="attribute">dir</span><span>=</span><span class="attribute-value">&quot;${docs}&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></li><br/>    <li class="alt"><span>&nbsp;&nbsp;</span><span class="tag"><span class="tag-name">target</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li><br/>    <li class=""><span class="tag"><span class="tag-name">project</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li><br/></ol><br/></div><br/><p>Windows下请将其中的两处 executable=&quot;phpunit&quot; 改为 executable=&quot;phpunit.bat&quot;。<br /><br/>使用以下命令执行任务：<br /><br/>ant test&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 执行测试<br /><br/>ant report&nbsp;&nbsp;&nbsp; 生成测试报告<br /><br/>ant clean&nbsp;&nbsp;&nbsp;&nbsp; 清理测试目录</p><br/><p><strong>最佳实践</strong></p><br/><p>每次编写好类定义后，自动生成测试用例。实现类和测试用例。修改，执行测试，反复重复这个过程。每次修改后，马上修改测试用例，以免之后忘记。</p><br/></span></p>]]></description>
   <link>http://thinkphp.cn/Blog/23</link>
   <pubDate>Tue, 13 Jan 2009 10:46:02 +0800</pubDate>
  </item>
  <item>
   <title>对第三方模板引擎的支持完善</title>
   <description><![CDATA[<p>在1.5.0正式版发布不久，我们的团队已经对第三方模板引擎的支持进行了完善，大大方便了第三方模板引擎的使用，目前可以支持包括Smarty、SmartTemplate、EaseTemplate、TemplateLite在内的第三方模板引擎，而且只需要简单配置即可，并且支持各自的配置参数的设置。例如，我们以Smarty模板引擎为例，只需要在项目配置文件中设置：&nbsp;</p><br/><div class="codeText"><br/><div class="codeHead">PHP代码</div><br/><ol class="dp-c"><br/>    <li class="alt"><span><span class="string">'TMPL_ENGINE_TYPE'</span><span>=&gt;</span><span class="string">'smarty'</span><span>&nbsp;&nbsp;</span></span></li><br/></ol><br/></div><br/><p>即可在模板文件里面使用smarty模板标签了。如果想对smarty模板引擎进行一些参数设置，可以使用下面的配置参数：&nbsp;</p><br/><div class="codeText"><br/><div class="codeHead">PHP代码</div><br/><ol class="dp-c"><br/>    <li class="alt"><span><span class="string">'TMPL_ENGINE_CONFIG'</span><span>=&gt;</span><span class="keyword">array</span><span>(&nbsp; &nbsp;&nbsp;</span></span></li><br/>    <li class=""><span class="string">'caching'</span><span>=&gt;true,&nbsp; &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span class="string">'template_dir'</span><span>=&gt;TMPL_PATH,&nbsp; &nbsp;&nbsp;</span></li><br/>    <li class=""><span class="string">'compile_dir'</span><span>=&gt;CACHE_PATH,&nbsp; &nbsp;&nbsp;</span></li><br/>    <li class="alt"><span class="string">'cache_dir'</span><span>=&gt;TEMP_PATH&nbsp; &nbsp;&nbsp;</span></li><br/>    <li class=""><span>)&nbsp;&nbsp;&nbsp;</span></li><br/></ol><br/></div><br/><p>&nbsp;模板引擎的设置参数是根据所使用的第三方模板引擎的配置参数来定义的，不是固定的，可以随意增加不同的设置参数值。之前在TP里面使用第三方模板引擎的话，需要开启插件，并放入相关的类库文件，现在由插件改成第三方类库的形式调用了，提高了效率，无需再开启插件机制即可使用第三方模板引擎。</p>]]></description>
   <link>http://thinkphp.cn/Blog/22</link>
   <pubDate>Thu, 08 Jan 2009 09:50:16 +0800</pubDate>
  </item>
 </channel>
</rss>
