leechael.orgHome

OO in PHP

如果你也是一个 PHP Programmer:你知道怎么用 PHP 写程序,自信 PHP 已经入门了;你知道 Project Babel 并倾慕于加入对 OO 支持后的 PHP 的代码;你知道 Zend FrameworkCakePHP 这般的 Framework,以及 OO 带来的,开发效率的提升;那么,我推荐你阅读 PHP in Action

好了,对书的推荐到此为止;这里不是 OO 教程,我只在这里谈一谈 OO。OO —— Object-Oriented——是用来干复杂的事情的,它既为我们带来开发效率的提升,在使用恰当的情况下,也可以得到不错的运行效率。自然,我也曾经是 OO 的重度使用者,甚至想在 PHP 代码中尽可能地使用 try {} catch {} 来代替 if {} else {}。但 OO 不是一切。或许先来看看下面的这个描述。

你在一间不大也不小的房间里,房间里除了你以外,还有好几个人,你们是一个 team,协作开发软件,而你是 team leader。你知道 A 君长于界面设计,B 君只会写代码,C 君是一个很有经验的系统维护人员。这天你接到一个 case,你亲自完成策划案后,将结果分开为不同的部分交给你的伙伴们。当然,C 君负责 LAMP 的配置,而这个任务你也不会让对服务器配置一无所知的 A 君负责。

原谅我的词不达意;希望上面的这段东西能够帮助你理解 OO。在这里,ABC 三人就是对象,他们专长于他们懂得的事情,而不懂其他伙伴懂得的事情。当你只需要代码的时候,你不会让 C 君来参与 B 君的工作。

工作很顺利,你的这个小团队扩展到数十人,原来的伙伴也成为了小头目。A 君还是继续负责界面的设计,但随着项目规模的扩大,他现在只负责整体界面的一致性,细节部分由其手下的人员来负责。

不知道用这个来解释继承是否有些勉强呢?

这个团队已经不小了——原本的小房间已经容不下更多人了。由于你们团队的高效、代码的质量很不错,所以财源滚滚,所以你决定换一个更大的工作间。

到这里——一切都完了。假设这个房间是内存,这些工作者是对象——以此类比 OO,你是否有更深刻的了解了呢?

OO 是用来干复杂的事情。PHP 和 Python 都不是很极端 OO 的 Program Language,相对于 JAVA 来说。如果你对某个故事有印象:在屏幕上输出“Hello world!”——那么你一定记得,Hacker 的办法是,“echo 'Hello world!'”——bash script。JAVA 能用一句代码实现吗?不能。但是,JAVA 能比 bash shell 干更多的事情,例如,使用 bash shell 你无法写一个 Gtalk Robot。

实际上,我们需要考虑为什么 PHP 和 Python 并不是极端的 Object-Oriented Program Language:对于脚本语言来说,它们更需要的是 Get Things Done。下一次我将以一个例子来说说使用 OO 提高开发效率应有的思路。

5 comments

2007-12-14 9:13:40 +0800, kernel1983 said,

哦,亲爱的Python,有人说你不是极端的OO

其实我很喜欢JS对自己的称呼,Object-based 而不是 OO

2007-12-16 12:38:56 +0800, Kent said,

辛苦了
不过是我的话我就不会这么来解释OO
可能是我理解错误,这篇博文中有几个不足:
没给出面向对象的定义
没很好地解释对象
没说明面向对象中的封装、多态性
对继承的解释似乎也不太正确

2007-12-16 16:45:12 +0800, Leechael said,

@Kent
1. OO 的定义,就是“老虎是猫科动物”。具体怎么了解我想这会是在实际使用中,某个时刻的顿悟。
2.这篇不是 OO 的入门教程,什么是对象、封装、多态性、继承,这些概念在很多教程中都有提及,不需要我再去重复制造轮子了。 :P
3.我承认例子很不恰当…… >_< 本意是想提及,OO 使用与否的问题,例如,exception 其实是昂贵的,例如上面 kernel1983 提及的那个词语,“Object-based”,OO 的使用与否,对于本不是 Object-Oriented Program Language 的 PHP 来说是一件需要衡量的事情。

2008-1-17 12:40:06 +0800, Livid said,

Have a look at:

/dev/tcp/YOUR_HOST/PORT

Bash can read from it.

2008-1-17 12:47:19 +0800, Livid said,

Everything is a file is the fundamental Unix ideology that bash is born for.

In Java, everything is an object.

They're different doesn't mean that they cannot achieve same objectives.

Wanna say something?