定义一个类,定义类应该有的方法,然后通过继承来定义每一种
产品的类(SoundItem类, ViewableItem类,等等),重定义每个
产品类的方法,使它们如你所需。根据你保存在
数据库中的表的
产品类型字段来给每一种
产品类型定义一个类,一个典型的
产品表应有字段(id, 类型, 价格, 描述,等等)。
在脚本中你从
数据库的表中获取类型信息,然后实例化相应类的对象:
$obj=new $type(); $obj->action();
?> |
这是PHP比较的特性,你可以调用 $obj 的显示方法或其他方法而不用去管对象的类型。通过这种技术,当你增加一种新类型的对象时,你不需要去修改脚本。这个方法有点威力,就是定义所有对象应有的方法而不管它的类型,然后在不同的类中以不同的方式来实现,这样就可以在脚本中对不同的类型对象使用他们,再没有 if, 没有两个程序员在同一个文件里,永远快乐。你相信编程是这样快乐不?维护代价小并且可重用?
如果你带领一组程序员,最好的方法是划分任务,每人可以对某种类和对象负责。国际化可以用同样的技术解决,使合适的类对应使用者选择的不同的语言等等。
复制和克隆 当你创建一个对象 $obj, 你可以使用 $obj2 = $obj 来拷贝一个对象,新的对象是 $obj 的一个拷贝(不是引用),所以在赋值完新对象有 $obj 同新的状态。有时候你不想这样,只想创建和 obj 同样的新对象,调用新对象的构造函数如同你曾使用过 new 命令。这可以通过PHP的串行化和使用基类并且其他类必须从基类继承来达到。
进行危险的地带 当你串行化一个对象,你得到一个有特定格式的字符串,如果你有好奇心,可能你会探寻其中的秘密,字符串中有一个东西就是类的名字,你可以解开它:
$herring=serialize($obj); $vec=explode(:,$herring); $nam=str_replace("\"",\,$vec[2]);
?> |
假设你创建一个类 "Universe" 并且使所有类都从 "Universe" 继承而来,你可以在 "Universe" 定义一个克隆的方法:
class Universe { function clone() { $herring=serialize($this); $vec=explode(:,$herring); $nam=str_replace("\"",\,$vec[2]); $ret=new $nam; return $ret; } }
//Then:
$obj=new Something(); //Something extends Universe !! $other=$obj->clone();
?> |
你所得的是类 Something 的新对象如同使用 new 一样,并且构造函数被调用等等。我不知道这对你是不是有用,这是一个很好的实践,Universe 类知道它的继承类的名字。对你来说,唯一的限制是你的想象力!!!
注意:我使用的是PHP4, 文章里有些东西可能不适合PHP3。