分享
 
 
 

PHP中的面向对象编程:通向大型PHP工程的办法

王朝php·作者佚名  2008-05-21
窄屏简体版  字體: |||超大  

这篇文章介绍在 PHP 的面向对象编程(OOP)。我将演示如何用面向对象的概念编出较少的代码但更好的程序。祝大家好运。

面向对象编程的概念对每一个作者来说都有不同的看法,我提醒一下一个面向对象语言应有的东西:

- 数据抽象和信息隐藏

- 继承

- 多态性

在PHP中使用类进行封装的办法:

<?phpclass Something {

这样类 "Another" 的对象拥有父类的所用成员变量及方法函数,再加上自己

的成员变量及成员函数。如:

$obj2=new Another;

$obj2->setX(6);

$obj2->setY(7);

多重继承不被支持,所以你不能让一个类继承多个类。

在继承类中你可以重新定义来重定义方法,如果我们在 "Another" 重新定义 getX,那么我们不再能存取 "Something" 中的成员函数 getX. 同样,如果我们在继承类中声明一个和父类同名的成员变量,那么继承类的变量将隐藏父类的同名变量。

你可以定义一个类的构造函数, 构造函数是和类同名的成员函数,在你创建类的对象时被调用。

<?phpclass Something {

如果你在定义基类是需要这个特点,可以通过在构造函数中调用 "die",这样你就可以确保它不能实例化,现在定义抽象类的函数并在每个函数中调用 "die",如果在继承类中程序员不想重定义而直接调用基类的函数,将会产生一个错误。此外,你需要确信因为PHP没有类型,有些对象是从基类继承而来的继承类创建的,因此增加一个方法在基类来辨别类(返回 "一些标识")并验证这一点,当你收到一个对象作为参数派上用场。 但对于一个恶棍程序没用办法,因为他可以在继承类中重定义此函数,通常这种办法只对懒惰的程序员奏效。当然,最好的办法是防止程序接触到基类的代码只提供界面。

重载在PHP中不被支持。在面向对象编程中你可以通过定义不同参数种类和多少来重载一个同名成员函数。PHP是一种松散的类型语言,所以参数类型重载是没有用的,同样参数个数不同的办法重载也不能工作。

有时候,在面向对象编程中重载构造函数很有用,所以你能以不同的方式创建不同的对象(通过传递不同的参数个数)。一个小巧门可以做到这一点:

<?phpclass Myclass {

<?phpfunction niceDrawing($x) {

我希望PHP将来能全面支持串行化。

使用类来操纵保存的数据

PHP 和面向对象编程中一个比较好的地方是你很容易定义类来操纵某些东西,并且当需要时调用合适的类。假设有一个HTML文件,你需要通过选择产品的 ID 号来选择一个产品,你的数据保存在数据库中,而你想显示产品的信息,如价格等等。你有不同种类的产品,同样的动作对不同的产品有不同的含义。例如,显示一个声音意味着播放它,而对其他产品来说可能是显示一个存储在数据库的图片。你可以用面向对象编程和PHP来达到,代码少但更好。

定义一个类,定义类应该有的方法,然后通过继承来定义每一种产品的类(SoundItem类, ViewableItem类,等等),重定义每个产品类的方法,使它们如你所需。根据你保存在数据库中的表的产品类型字段来给每一种产品类型定义一个类,一个典型的产品表应有字段(id, 类型, 价格, 描述,等等)。在脚本中你从数据库的表中获取类型信息,然后实例化相应类的对象:

<?php$obj=new $type();$obj->action();?>

这是PHP比较的特性,你可以调用 $obj 的显示方法或其他方法而不用去管对象的类型。通过这种技术,当你增加一种新类型的对象时,你不需要去修改脚本。这个方法有点威力,就是定义所有对象应有的方法而不管它的类型,然后在不同的类中以不同的方式来实现,这样就可以在脚本中对不同的类型对象使用他们,再没有 if, 没有两个程序员在同一个文件里,永远快乐。你相信编程是这样快乐不?维护代价小并且可重用?

如果你带领一组程序员,最好的方法是划分任务,每人可以对某种类和对象负责。国际化可以用同样的技术解决,使合适的类对应使用者选择的不同的语言等等。

复制和克隆

当你创建一个对象 $obj, 你可以使用 $obj2 = $obj 来拷贝一个对象,新的对象是 $obj 的一个拷贝(不是引用),所以在赋值完新对象有 $obj 同新的状态。有时候你不想这样,只想创建和 obj 同样的新对象,调用新对象的构造函数如同你曾使用过 new 命令。这可以通过PHP的串行化和使用基类并且其他类必须从基类继承来达到。

进行危险的地带

当你串行化一个对象,你得到一个有特定格式的字符串,如果你有好奇心,可能你会探寻其中的秘密,字符串中有一个东西就是类的名字,你可以解开它:

<?php$herring = serialize($obj);$vec = explode(":",$herring);$nam = str_replace(""", "", $vec[2]);?>

假设你创建一个类 "Universe" 并且使所有类都从 "Universe" 继承而来,你可以在 "Universe" 定义一个克隆的方法:

<?phpclass Universe {

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有