+ -
当前位置:首页 → 问答吧 → php设计模式-中级

php设计模式-中级

时间:2007-04-21

来源:互联网

php设计模式-中级


在上一次的介绍了c的编程的一些方法,今天就重点的说一下php的设计的一些方法。
首先,php是采用c来开发的,他们有很多的相似的地方,特别是在编码的方面,我想这也是因为开发php的人主要是作c的把,把他们的编码习惯也映射到了php中,可是他们最主要的区别在于c是编译的,用中间代码生成,而php是解释型的,没有中间代码的生成,为此,使用c的一些方法对于php就不是很合适,所以今天的就合上一篇的文章的差异就大一些。
这篇文章主要从下边的几点来分别的详细说明:
1 测试在前。
  1.1 测试的目的
     一般的在任何一种编程语言中,他们的编译器或者是解释器,在程序运行的时候只是检查他们限定的或者是语法的错误,不能对项目需求或 者是别的地方进行检查,可能会给程序带来未知的bug。我们测试的目的不旦旦是为了检验我们的程序是不是可以运行,可以完成模一项功能,更重要的是对现在使用的编译器或者是解释器的一种补充,检验代码的安全,排除未知的bug,保证程序的健壮性,同时也涵盖了对程序的可运行和功能的检查。
     极限编程的爱好者们把测试在前的编码这种方式在项目的开发中使用,并且去得了很好的效果,还有很多的人在追捧他,所以对他的使用也是五花八门,在这里我部做过多的介绍,只是使用极限编程的一个很重要的地方TDD,中文意思是测试驱动,这种方式要求我们在编码之前,对需求分析进行准确把我之后,这一段时间,根据需求分析的要求,对程序的功能,可能遇到的边界值,错误输入等一系列的问题进行提前的思考,然后做成测试的用例,程序原根据要就编写代码,在运行程序的时候自动的运行测试用例,根据测试用例的输出结果判断程序的正确性等要求。
  1.2 测试的方法
     php的测试就现在而言,主要是在开发之后对程序的运行结果(页面和数据库的结果的进行检查,而且是手工的)进行检查,这样的不好之处在于,测试在后,在测试的结果出来之前,程序原已经做了大量的工作,如果测试的结果错误较多,对代码的修改就会更多,程序员在修改代码的时候是一种被动的行为,加上些代码和测试后修改的时间间隔,思维就会和些代码的时候有较大的不同,这就可能带来新的未知的错误,并且在时间上又是一种浪费,如果测试在前的话,每一次的单元测试都运行测试用例,程序员是在编码的同时对程序进行测试,思维还是很清楚的情况下,带来的好处会更多。
     这就是为什么要在编码之前就编写测试用例的原因。那么我们该如何的编写测试那,下面我就下一个简单的测试用例,方便大家参考。
     假设有一个处理文件上传的upFile函数文件,要求上传的文件的大小不得大于1M,文件类型是jpg格式,文件保存在../img的文件夹下,如果正常的话就返回TRUE,否则返回FALSE,具体的文件上传的php文件就不编写,相信大家都会,我在这里仅仅的便从、些如何测试这个文件。具体看代码清单1.1
     /**
     code 1.1
     @文件名: test.php
     @作者:   耿鸿飞
     @日期:   2007-4-20
     @描述:   对上传文件upFile()方法的检验。
     */
     <?php
     include(“upFile.inc“);
     defined("len",1024*1024);
     $size = $_FILE[‘upfile’][‘size’];
     $type = $_FILE[‘upfile’]["type"];
     if($size > len || $type != "jpg")
     {
        if(upFile())
        {
           echo "no litmit upFile size or type";
        }
     }
      if(!upFile())
        {
           echo "right file size and type , but not save upFile ,pleace check you FUNCTION upFile()";
        }
        else
        {
        if(exist("../img/$_FILE['name']"))
         {
           //检查保存后文件的大小和类型,书否和要求一致。然后输出相应的字符。
         }
        }
     echo <<<EOF
     <html>
    ...
    <file name=upfile>
    ...
    </html>
     EOF;
     ?>
     在写完程序之后直接的在浏览器中输入http://127.0.0.1/test.php,然后上传文件进行测试,其实这一种的测试方法还是很不方便,还要不断的进行测试,有没有更好的办法那,其实是有的,你可以在相应的目录建立一些符合要求和不符和要求的文件,然后在测试文件中,对$_FILE['upfile']不断的进行赋值,然后执行上边的代码,就可以验证所有的输入,做到全面的测试了,有兴趣的朋友可以自己些这些代码。我在这里就不在写了。
2 编码要求
   编码是对程序的实现工作,一般每一个公司都有自己一套的编码规范,要做到统一是不容易的,所以你在公司的编码就要符合公司的要求,一般的规范是骆驼命名发,但是在使用常量的时候和c语言的定义宏一样,全部大写,单词之间用_,类的命名和java一样,第一个单词的首字母大写,然后就是骆驼命名法的规则。当然要根据自己的情况而定了,这样作的目的主要是为了以后的维护,使用一种好的统一的命名方法,可以方便的对程序进行维护。
3 文件调用
  3.1 文件调用的好处
     php的include等方法和c语言的include的功能一样,是在文件的这个位置使用包含的文件的代码来替换他们,但是php的一些方法如果从父就会替换前边的定义,有时候还可能出现别的问题,特别是在文件的反复调用的情况下,比如A调用了B文件,C文件也掉用了B文件,然后c文件又调用了A和B文件,如果是使用的include函数,这样的话就更容易出现问题了,但是php还提供了include_once()等方法,让这样的代码只出现一次,这就类似于c语言的下边的定义,
     #ifndef LIB_H
     #include "lib.h"
     #endif //LIB_H
     这样就避免了代码的重复。
     php之所以提供这样的函数是为了公用代码的分离,减少工作量,提高开发的效率,比如说,程序中要经常的和数据库进行连接,如果每一个页面都要新建的话就会增加一段代码,但是如果把数据库的连接专门的提取出来,然后在每一个需要和数据库连接的程序中直接的调用数据库连接文件的话,就减少了很多不必要的编码工作,在项目的开发过程中,常常有很多的相同的代码,只要把他们提取出来,就会减少很多的编码工作,这就很大程度上提高了开发效率,缩短了开发时间。
  3.2 文件调用可能遇到的问题
     使用文件的包含虽然可以提高效率,加大程序的耦合性,但是不一定会给我们的程序带来好的运行效率,因为php的这种方式使用文件操作,把要包含的文件读取出来,然后在当前的位置显示,他的这种特性和c语言#include有不同,以为c语言是把文件替换之后然后编译成中间文件,也就不存在反复的读取文件的问题了。但是php是解释型的,在每一次的执行的时候都要去读取文件,然后替换,但是,加入我们有一个程序很复杂,有很多的业务逻辑要处理,我们可能需要包含大量的文件,这样一个程序需要反复的去读取文件,执行的效率必然会要影响,还有变量的命名可能就会有重复的,造成程序的不可知的错误,如何解决这个问题请看3.3平衡文件调用的策略。
  3.3 平衡文件调用的策略
      上边对文件包含的优点和确定进行了分析,那么到底该如何的平衡这种关系那,这里可以给出一个简单的办法,程序的包含文件一般不超过5个,这样就可以把一般常用到的文件抽象出来,然后写成文件的形式,文件要尽量的断,最好不要超过500行,或者是一个文件就实现一个功能,如果程序的业务逻辑很复杂,要用到很多的文件,我们己考虑这样复杂的程序是不是很多,如果很多的话,我们就按照文件的作用,把多个文件和并称一个文件,然后在程序中调用,如果这样复杂的程序很少很少,我们可以把其他的文件直接到拷贝到这个程序中,减少文件的操作,以次提高程序的效率。
4 使用面相对象
  4.1 使用面相对象好处
     面相对象的好处很多,介绍的也很多,在这里我不做介绍,如果你对面相对象不是很了解,建议你去网上查找相关的资料。
  4.2 使用面相对象容易忽略的问题
     在使用面向对象的使用过程中,即使很有经验的开发人员也可能会犯的错误就是对象的传递是引用的,其实很多的面相对象的语言都是这种的方式,包括java,php等,他们在方法的参数如果是对象的话,如果在方法中对对象的属性进行设置,就会影响到原有的对象,在大多数的面向对象的语言中都有相应的方法来实现对对象的拷贝,比如java是使用对象对Object对象的copy方法经覆盖来实现的,php就可以直接的编写cone来实现,为此,在我们使用对象传递参数,同时又不希望在该方法中对该对象的修改影响到原对象的时候一定要把对象的拷贝传递进来,即在方法调用前对对象进行拷贝,传给方法的是该对象的拷贝就可以了。
5 优化代码
  5.1 时间优化
     对于时间的优化我们需要考虑的是这个程序如果正常的退出需要运行到少条语句,看清来好像不容易的对他进行优化,其实不然,我们要对程序的运行时间进行优化可以给出一些简单的策略:1,对于需要反复进行的运算进行预处理,比如,一个网上商城,假设有100种商品,他们对于特定会员的打折幅度是不一样的,还要根据会员的积分来相应的优惠,一个vip会员一次购买了20种商品,在他要去结帐的时要进行计算总得价格,如果你去按照如下的代码去写的话效率就不是很高
     <?php
     $jiFen =100;
     $zhekou = 0.37;
     $sum=0;
     for($price as $product)
     {
         $sum = $jiFen/10*$zhekou*$price;
     }
     echo $sum;
     ?>
     上边的代码是非常的糟糕的,为什么那?在进行计算的时候要反复的在循环中进行计算工作,现在我们来对他进行优化,砍下变得代码
      <?php
     $jiFen =100;
     $zhekou = 0.37;
     $jiFen = $jiFen/10*$zhekou;
     $sum=0;
     for($price as $product)
     {
         $sum = $jiFen*$price;
     }
     echo $sum;
     ?>
     在经过这样的修改之后的效率就会很大的提高。
     2。如果两个循环可以合并的话,尽量的把他们合并到一个循环当中。
     3。在对文件进行操作的时候在读取的时候不要一个字符一个字符的读取,尽量的一次读取一行或者是更多。
  5.2 内存优化
     内存优化是用尽量少的变量来处理程序,这需要熟练的运用数据结构,这里不说了,有兴趣的朋友请参考数据结构方面的书籍。








作者: eoe2005   发布时间: 2007-04-20

不错,支持,就是错字太多,cone也打错了

作者: weiwei   发布时间: 2007-04-20

我看了半天,哪一点和设计模式有关?

作者: fleaphp   发布时间: 2007-04-21

以后要主义了
坚决不再些错别字
大家要多多支持阿

作者: eoe2005   发布时间: 2007-04-21

顶一个

作者: dzjzmj   发布时间: 2007-04-21

志凡太好了,老是给我鼓励

作者: eoe2005   发布时间: 2007-04-21

引用:
原帖由 eoe2005 于 2007-4-21 21:21 发表
以后要主义了
坚决不再些错别字
大家要多多支持阿
你这句里又有错别字,:L

作者: niohe   发布时间: 2007-04-22

同廖老大。。。。没见设计模式

作者: Phzzy   发布时间: 2007-04-22

你在仔细的看看,
你要是还看不到,
那可能就是你的眼神不好了
最主要的原因是我就不知道什么叫设计模式
我只是看到这个很世贸,我就来了,
嘎嘎 :victory: :victory: :victory: :victory:

作者: eoe2005   发布时间: 2007-04-22

引用:
原帖由 fleaphp 于 2007-4-21 02:19 发表
我看了半天,哪一点和设计模式有关?
同意

作者: muqiao   发布时间: 2007-04-22

你们这些家伙给点没面子行不行

作者: h058   发布时间: 2007-04-23

很世贸。不错,有收获就是好的。

作者: new_shop   发布时间: 2007-04-23

呵呵, 顶个先了

作者: cator   发布时间: 2007-04-23

太时髦了。。

作者: 玉面修罗   发布时间: 2007-04-24

吃饭睡觉打架

作者: 逆雪寒   发布时间: 2007-04-24

读完,不错!~~~

作者: forest   发布时间: 2007-05-22