+ -
当前位置:首页 → 问答吧 → Web方式下,PHP中的OOP单元本质错位

Web方式下,PHP中的OOP单元本质错位

时间:2007-05-05

来源:互联网

发信人: diogin (说,这段日子会成为回忆), 板面: WebDev
标  题: Web方式下,PHP中的OOP单元本质错位
发信站: 飘渺水云间 (Fri May  4 06:04:26 2007), 站内信件

跟C++之类的OOP语言比较,PHP的OOP单元有它本质的错位。
这种错位导致我一直以来在看基于C++之类语言的面向对象书籍时都觉得不对劲,最
近才真正认识到。。。这种错位只针对web开发方式下的PHP,这种方式下,PHP是从
接收到请求开始,力求最快解释执行完,而非长期驻留的daemon。错位所在地方为:

C++中的static域/函数,是编译期概念。然而对编程人员而言,PHP并不存在这个阶
段(这个阶段是由Zend引擎直接提供给脚本的),所以实际上在PHP中是不存在类似
C++的static成员这个概念的,PHP中的static域并不是真正的static。事实上,PHP
中的static域,是C++中的实例域,PHP中的类即是C++中的实例!再往上一层,PHP
中的实例,实际上在C++中并没有等价物,可以把它想象成实例的实例。

PHP的一次解释执行,就类似执行C++中的实例的一个方法。PHP中的static生命周期
是一次解释执行,所以PHP的static成员就相当于C++中的实例成员。

而PHP的实例成员,实际上可以想象成实例的实例。基于这种错位调整,目前大多数
PHP框架都没有跟这种本质对上,在这些框架中存在大量的new,而这种new在PHP中
是根本没必要的。需要new的情况基本上只有一种,就是在一次解释执行中,需要操
作某个领域类的多个对象时。注意,领域类本身实际上就是个对象,所以该领域类
的对象实际上是对象的对象。

PHP技术框架中,应用层的一些类,本质上都是一个个对象。在一次解释执行中,它
们都是单件,多个解释并行起来,才对应上C++里的多个对象。如Dispatcher,
Router,Request,Response,Action,Ajax,View,等等,都是以C++对象形式出
现的PHP类。

幸运的是,在PHP模仿Java的过程中,还是提供了足够的特性让我们基于上述观点来
编写没有错位的框架:PHP的static函数可以是基于类名进行多态的,所以可以进行
传统面向对象编程。需要注意的是,PHP目前没有提供类似“$className::f()”形
式的static多态调用,必须用

call_user_func(array($className, 'f'));

的方式调用。如果需要给f传参数,则用

call_user_func_array(array($className, 'f'), array($var1, $var2));

即可。目前已经有人提交了一个patch,可以直接支持“$className::f()”形式的
调用,希望能被接受并加入语言支持中。可惜的是,abstract static function在
PHP 5.2后已经被归入不合标准的范畴了,只能通过implements一个包含static
方法的interface来绕弯实现传统的多态,实在是遗憾。

另外顺路提一下,提交这个patch的是智利的一位86年的学弟…… orz一下~


--
あの星を集めて この胸に饰りたい
あの梦を��いで 二人踊った GLAMOROUS DAYS

※ 来源:・飘渺水云间 freecity.cn・[FROM: diogin]

[ 本帖最后由 diogin 于 2007-5-4 23:08 编辑 ]

作者: diogin   发布时间: 2007-05-04