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 编辑 ]
标 题: 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
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28