当前位置:首页> PHP教程> PHP精通
关键字
文章内容
开发大型PHP项目的方法(五)
 
 
修改时间:[2011/04/29 15:29]    阅读次数:[983]    发表者:[起缘]
 
作者Luis Argerich 译者limodou





使用类进行数据存储

  对于PHP和OOP一件非常好的事情就是
你可以很容易地定义一个类来操作某件事情并且无论何时你想

用的时候都可以调用相应的类。假设你有一个HTML表单
用户可以通过选择产品ID号来选择一个产品。在数

据库中有产品的信息
你想把产品显示出来显示它的价格等等。你拥有不同类型的产品并且同一个动作

可能对不同的产品具有不同的意思。例如
显示一个声音可能意味着播放它但是对于其它种类的产品可能

意味着显示一个存在数据库中的图片。你可以使用OOP或PHP来减少编码并提高质量




  定义一个产品的类
定义它应该有的方法例如显示然后定义对每一种类型的产品的类从产品

类派后出来
SoundItem类ViewableItem类等等覆盖在产品类中的方法使它们按你的想法动作。



  根据数据库中每一种产品的类型
(type)字段给类命名一个典型的产品表可能有(id, type, price,

description
, 等等字段)...然后在处理脚本中你可以从数据库中取出type值然后实例化一个名为type

的对象




-----------------------------------------------------

<?php



$obj
=new $type();

$obj
->action();



?>
---------------------------------------------------

  这是PHP的一个非常好的特性你可以不用考虑对象的类型调用$obj的显示方法或其它的方法。使用

这个技术
你不需要修改脚本去增加一个新类型的对象只是增加一个处理它的类。



  这个功能很强大
只要定义方法而不去考虑所有对象的类型在不同的类中按不同的方法实现它们然后在主脚本中对任意对象使用它们没有if...else也不需要两个程序员只有高兴。



  现在你同意编程是容易的
维护是便宜的可重用是真的吗



  如果你管理一组程序员
分配工作就是很简单的了每个人可能负责一个类型的对象和处理它的类。



  可以通过这个技术实现国际化
根据用户所选的语言字段应用相应的类就可以了等等。





拷贝和克隆

  当你创建一个$obj的对象时
你可以通过$obj2=$obj来拷贝对象新的对象是$obj的一个拷贝不是一

个引用
所以它具有$obj在当时的状态。有时候你不想这样你只是想生成一个象obj类一样的一个新

的对象
可以通过使用new语句来调用类的构造函数。在PHP中也可以通过序列化和一个基类来实现但所

有的其它类都要从基类派生出来。







进入危险区域

  当你序列化一个对象
你会得到某种格式的字符串如果你感兴趣你可以调究它其中字符串中有

类的名字
太好了你可以把它取出来



-----------------------------------------------------

<?php



$herring
=serialize($obj);

$vec
=explode(':',$herring);

$nam
=str_replace("\"",',$vec[2]);



?>
---------------------------------------------------

  所以假设你创建了一个"Universe"的类并且强制所有的类都必须从universe扩展你可以在universe

中定义一个clone的方法
如下

-----------------------------------------------------

<?php



class Universe {

function clone() {

$herring
=serialize($this);

$vec
=explode(':',$herring);

$nam
=str_replace("\"",',$vec[2]);

$ret
=new $nam;

return $ret;

}

}



//然后

$obj=new Something();



//从Universe扩展

$other=$obj->clone();



?>---------------------------------------------------

  你所得到的是一个新的Something类的对象它同使用new方法调用构造函数创建出的对象一样。我不

知道这个对你是否有用
但是Universe类可以知道派生类的名字是一个好的经验。想象是唯一的限制。


  注意
我用的是PHP4我写的有些东西在PHP3下可能不能工作