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

原创 2003年06月25日 15:53:00

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'.' world ';    //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中,关于构造器规则的变化的说明驻足于此。下一篇将介绍按引用传递参数的不兼容问题。

express4.x新特性以及如何从3.x升级到4.x

express4.x新特性以及如何从3.x升级到4.x 原文  http://johnnyfee.github.io/2014/06/23/express4-from-express3/ ...
  • busyboxs
  • busyboxs
  • 2014年08月18日 22:05
  • 479

PHP面向对象编程 面向对象的基本实践

1、类的概念:
  • qq_28893679
  • qq_28893679
  • 2016年12月16日 15:17
  • 250

PHP面向对象编程详解:类和对象

PHP面向对象编程详解:类和对象 从OOP的视角看,不应区分语言。无论是C++、无论是Java、无论是.net还有更多面向对象的语言,只要你了解了OO的真谛,便可以跨越语言,让你的思...
  • hello_katty
  • hello_katty
  • 2015年06月17日 07:40
  • 2702

PHP的面向对象编程思想

这篇文章介绍了在PHP中的面向对象编程(OOP,Object Oriented Programming)。同时演示了如何通过使用一些OOP的概念和PHP的技巧来减少编码和提高质量。PHP 是一个混合型...
  • qq_34275925
  • qq_34275925
  • 2016年06月20日 10:45
  • 3491

个人PHP学习笔记(五)--面向对象的程序设计

目录 基本语法 语句结构 函数 数组 面向对象的程序设计 字符串 正则表达式 常用函数 文件系统 图形图像处理 MySQL数据库 Cookie&Session 错误和异常 面向对象的程...
  • u013474558
  • u013474558
  • 2015年05月19日 11:24
  • 522

php面向对象编程之--封装

php面向对象编程的三大特征 ①、封装 ②、继承 ③、多态 抽象:我们在前面研究类时,实际上是把一类事物的共有的属性和行为提取出来,形成一个物理模型。这种研究问题的方法称为抽象。 封装:  封装...
  • u013372487
  • u013372487
  • 2015年07月01日 17:20
  • 1191

Express 4.x的特性和3.x的迁移

Express 4.x较Express 3.x进行了较大的改动,原来基于Express 3.x的项目无法直接升级到 4.x。本文对Express网站的内容进行了简单的总结,希望能够帮助大家更好的了解E...
  • wuzhongchao
  • wuzhongchao
  • 2015年01月05日 02:44
  • 223

读《深入php面向对象、模式与实践》有感(一)

什么样的代码需要改进?书中给出了四个标准(我个人比较认可这四个标准,实际开发中也的确时常遇到): 一、代码重复 用书中的原话讲:“如果你在写代码的时候,总是感觉似曾相识,很可能你的代码已经...
  • RedCode_
  • RedCode_
  • 2016年02月28日 14:55
  • 1103

php面向对象方法实例(详细)

一、php面向对象的简单列子 以人为列子:
  • hj960511
  • hj960511
  • 2016年05月23日 10:30
  • 15343

为什么PHP要学习面向对象编程

学习PHP的OOP(面向对象编程)一周,由于学习进程的紧迫,自己只是一直在听老师讲,而没有想过为什么要学习OOP,周末稍有空余时间,自己不禁感慨,一些功能靠以前的知识明明可以很轻松地写出来,而通过OO...
  • qq_32080545
  • qq_32080545
  • 2016年06月19日 12:01
  • 756
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Php 3.x与4.x中关于对象编程的不兼容问题之一 构造器说
举报原因:
原因补充:

(最多只允许输入30个字)