Php 3.x与4.x中关于对象编程的不兼容问题之一 构造器(函数)说

ABabyStudio 2003-06-23 02:23:06
Php 3.x与4.x中关于对象编程的不兼容问题

“面向对象”听起来是个很流行的词汇,似乎到了如果你还没有OOP,那不如回家种白菜的地步。
Php从版本3.x开始支持对象编程,虽然它的Class从一开始就饱受程序员们的指责,但它的确给我们带来了意外的惊喜。一路跌跌撞撞走来,到了4.x,Php已经相当OOP了。当然,它对于类变量的处理依然不能让人满意,没有私有、公有、保护、静态的声明方法。Php面向对象的可用性不在本文讨论范围内。
伴随着4.x中关于对象编程的完善,Php team给我们带来了“麻烦”:3.x和4.x中关于对象编程的一些游戏规则改变了,不兼容。笔者就实际开发过程遇到的问题稍作讨论,相信有些问题可能笔者尚未遇到,欢迎诸位补充、共赏。

一、构造器(函数)说

在3.x中,构造器指的是与类同名的类函数。有点拗口,不过更拗口的还有。在4.x中,构造器指的是在构造器内部直接定义的与类同名的类函数,就是说不包括继承来的类函数。比如:
1、
class ABabyStudio
{
function ABabyStudio(){
echo('call constructor'.chr(13));
}
//...
}
注释:
在3.x和4.x中效果相同
2、
class ABaby
{
function ABabyStudio(){
echo('ABabyStudio');
}
}
class ABabyStudio
{
//...
}
注释:
在3.x中类ABabyStudio有构造器,从父类ABaby继承获得;在4.x中将没有构造器。读者可试运行这样一行代码
$ABabyStudio=new ABabyStudio();
在3.x版本中应该会输出“ABabyStudio”,而4.x中则不会输出。

还有一点值得注意的是,在4.x中规定实例化一个对象时,只能为类变量指定常量值(或称作标量值)作为初始值。如果想要通过变量(通常是全局变量)、对象、表达式设定初始值,应该在构造器中进行操作。比如:
3、
class ABaby
{
//...
}
class ABabyStudio
{
var $ababy='hello every one'; //sentence 1
var $ababy='hello'.' every'.' one'; //sentence 2
var $ababy=new ABaby(); //sentence 3
var $ababy=array(); //sentence 4
var $ababy=g_hello; //sentence 5 , g_hello is a constant
function ABabyStudio(){
echo('call constructor'.chr(13));
}
//...
}
注释:
5个标示的sentence只有1、4、5可以在4.x下通过。不过,笔者没有了解Php工作组为什么让sentence 4通过,只能强迫自己理解为:array被作为一种基本数据类型,array()不被看作方法或表达式。

4、
class ABaby
{
//...
}
class ABabyStudio
{
var $ababy;
function ABabyStudio(){
$this->ababy='hello every one';
$this->ababy='hello'.' every'.' one';
$this->ababy=new ABaby();
$this->ababy=array();
$this->ababy=g_hello;
echo('call constructor'.chr(13));
}
//...
}
注释:
这段代码在3.x和4.x都能够编译通过,效果相同。


在3.x和4.x中,关于构造器规则的变化的说明驻足于此。下一篇将介绍按引用传递参数的不兼容问题。
...全文
2 点赞 收藏 7
写回复
7 条回复
goodname 2003年06月24日
php的oop确实很弱,楼主的精神确实佩服。
我在php编程中,使用class的次数很少,只是偶尔得封装了数据库类,或者只用到了一些
很浅显的oop的特征。
不过阁下的文章确实写的既有理论也有经验性的特征,我曾想过写写php的文章,但是呵呵
没打算写里面的oop相关的,我对这个所知不多,希望看到楼主的佳作,并把这部分写完整。
或许用java或者c++用的及其熟练的人都喜欢用oop的思想来构架系统。

至于说不要为php感到悲哀,只能说明你OOP还不够到家:)
就不免太偏激了,php小组自己都承认了目前的版本中php的oop很弱的说,如果构造复杂的
oop程序,难免不能从3.x->4.x。如果程序写的折衷,势必又降低了执行的效率。

天下没有完美的语言,哪一门也不是包治百病的良药。唯有扬长避短,才能够轻松的解决问题。
这只是针对使用领域来说得。vc操作数据库的功能不是很强,但是操作 系统底层 却得心应手。


呵呵,说得没有中心思想,纯粹是在跑题。






回复 点赞
babystudio 2003年06月24日
向左转,向右走
回复 点赞
babystudio 2003年06月24日
呵呵,OOP的确不到家,我依然不敢说自己是个OOP的程序员。
个人觉得,写出了许多Class并不见得就很好的理解了对象编程的精髓甚至概念,对象编程的确是个微妙又无限的世界。仁者见仁,智者见智。我的理解与大家共享而已。
回复 点赞
ipman 2003年06月23日
面向对象的优势在于:
修改部分接口即可实现跨平台,如果3.0不能轻松升级到4.0的话,不要为php感到悲哀,只能说明你OOP还不够到家:)
回复 点赞
ABabyStudio 2003年06月23日
重要的不是还有多少人在用3.x,是过去有很多人已经用了3.x。让这些人把3.x的代码统统扔进垃圾桶?呵呵
回复 点赞
xuzuning 2003年06月23日
5.0就要出来了,现在还有多少人在用3.0呢?
何况版本升级的原因不仅是技术的进步,重要的是安全性的提高
回复 点赞
ABabyStudio 2003年06月23日
为什么在发贴列表看不到自己的贴子?
回复 点赞
发动态
发帖子
基础编程
创建于2007-09-28

9734

社区成员

14.0w+

社区内容

从PHP安装配置,PHP入门,PHP基础到PHP应用
社区公告
暂无公告