WebjxCom提示:php教程:php设计模式之前言.
PHP4和
PHP5
当我写这本书的时候
,PHP5已经发行有一段时间了
,但是还没有被公众团体广泛的采用
。在我自己的工作上,我已经开始把新的应用程序开发工作迁移到PHP5.0.3的环境中,而且到目前为止我很高兴的发现PHP5对PHP4的代码具有很好的向后兼容性,同时它的面对对象模型是PHP5最有意义的新特征之一
。 有很多很好的文章和指导手册来处理不同PHP版本之间的对象模型之间的细微差别。但简单来说,PHP5提供了:
对象柄(将在下面解释,更详细的请见第二章:对象模型的价值)?
更好的构造器(统一名字,不允许改变)?
析构器?
可见度(方法和属性的public公开,protected受保护,private私有)?
异常处理(可以选择新的语法try{}catch{}来触发错误)?
静态类?
映像(动态检查类,方法,属性)?
类型隐藏?
PHP5也提供了一些更加模糊的特征:
新的魔术方法?
__get()和__set()允许你来控制变量存取
__call()让你能动态的截取被call对象的所有属性。
__sleep()和__wakeup()能让你重载序列化的方法
__toString()让你能控制如何用一个字符串来描述这个对象自身。
自动加载Autoloading(当类第一次被对象化时候,允许用户自动加载该类)?
Final(不允许该方法或者一个类被其子类重载)?
对象柄
PHP5最好的特性就是采用句柄来定义类,类似于一个文件或者数据库句柄。在PHP函数中使用对象不再是含蓄的复制这个对象,而是提供一个操作句柄。
为了更加清楚的看出其间的不同,我们考虑下面两个例子:
//PHP4class
classExampleP1{
var$foo;
functionsetFoo($foo){
$this->foo=$foo`;
}
functiongetFoo(){
return$this->foo;
}
}
functionchangeExample($param){
$param->setFoo(‘blah’);
return$param->getFoo();
}
$obj=newExampleP1;
$obj->setFoo(‘bar’);
echo$obj->getFoo();//bar
echoChangeExample($obj);//blah
echo$obj->getFoo();//bar
在PHP4中,函数changeExample()中的变量$param是$obj的一个复制,所以,这个函数没有改变原来对象中的$foo的值,这样$obj->getFoo()最终输出的是’bar’。
在PHP5中,由于$obj在函数中只是一个对象操作柄,同样的changeExample()函数确确实实的影响了原来的对象。换句话说,使用操作柄,就不再需要去复制了而$param就是$obj实例。
//PHP5class
classExampleP2{
protected$foo;
functionsetFoo($foo){
$this->foo=$foo;
}
functiongetFoo(){
return$this->foo;
}
}
$obj=newExampleP2;
$obj->setFoo(‘bar’);
echo$obj->getFoo();//bar
echoChangeExample($obj);//blah
echo$obj->getFoo();//IMPORTANT,producesblah
当你在其他的对象或者这个对象内置的构造函数(__construct)里面使用$this这个变量时,这个问题会变的更加的复杂。
结果是在PHP4中,你几乎总需要:
创建一个引用对象,就象这样$obj=?&newclass;
在函数中调用引用对象,比如functionfunc(?&$obj_param){}
通过引用函数来捕捉对象,比如function?&some_func(){}$return_obj=&some_funct()
事实上,现在有些情况下你也需要复制原始对象。在我的PHP4代码里面,我总是把任何无引用的对象任务比如为一个明显的对象复制注释的很清楚。从长期来说,这样的一个简短的注释能够极大的减轻任何一个维护你代码的人的头痛(译者注:这样的代码可维护性很强)。引用传值,对象柄和对象复制的相关知识将在第二章“对象模式的价值”里面详细讲解。
尽管我个人很偏向于使用PHP5开发,但我感觉到PHP4将继续被我们使用相当长的一段时间,而且现有的公开发布的项目也将继续支持PHP4。所以,本书对两种版本的PHP提供相同的支持。尽可能的提供了PHP4,PHP5两个版本的实例代码。在每一章里面,每一个代码块(在不同的PHP版本中有所改动的)中都提供有相应的注释来暗示其改变,比如//php4和//php5。
参考书目和其他资源
这里有很多相关的参考书来帮助你更好的学习设计模式。设计模式的“圣经”(译者译:最好的书)是ErichGamma,RichardHelm,RalphJohnson和JohnVlissides(他的开创性作品经常被提及为“GangofFour”简写为”GOF”,就是代表他们四个人)撰写的《设计模式:可重用的面对对象软件开发原理》。
关于“设计模式”,下一个最有用的关于PHPWEB应用程序设计模式方面的书就是MartinFowler出版的PatternsofEnterpriseApplicationArchitecture(译者译:
企业应用程序体系结构模型)。与GOF的书包含了所有一般的设计模式相比,Fowler的这本书详细的介绍了许多专门用于开发web应用程序的设计模式。
另外在很多网站上也提供了有关设计模式方面的丰富资源,一个特别典型的网站就是波特兰模型库(http://cz.com/por/)。
另外一个关于PHP设计模式的站点是phpPatterns,在线地址是http://www.phppatterns.com。
感谢
我很感谢我得老板,在他那里,我的任务和责任允许我在这个我感兴趣的领域花费一部分时间,也感谢他给我提供知识和经验让我有信心写完这本书。
我的灵感,想法和经验的另外一个来源是SitePoint这个站点(http://www.sitepoint.com)的论坛。特别值得一提的,那些经常上”AdvancedPHPForum”(译者译:PHP高级论坛)的投稿人都有着丰富的知识与经验,他们是我在网上发现的最慷慨大方的共享自己想法的团体。我也正是通过这些资源(译者注:SitePoint站点)登陆了SimpleTest(http://simpletest.sf.net),WACT(http://wact.sf.net)和其他许多我认为无价的PHP工程项目。在接下来的岁月里,我希望SitePoint能够继续成为PHP开发者的丰富资源点。
没有PHP开发团队的贡献和重要的努力,这本书显然是不可能存在的。因为正是他们开发出如此好用、易学、通用而且非常适合开发WEB应用程序的语言。
最后,我还要感谢MarcoTabini和php|architect的全体成员。这本杂志(译者注:php|architect)已经成为许多不同PHP主题的来源,而且这些主题都是专业的开发人员发布的。由Macro和公司主办的会议也是相当好的。