InfoQ

交流

讨论:关于 PHP4 中构造函数的一点点疑惑~

作者 Verdana 发布于 2003-08-00 分类:php基础编程

其实好早以前就发现这个问题。

关于PHP4构造函数,实际的情况与 PHP4 手册上面叙述的并不相
符合。

大家都知道我们定义一个类,如果类中有一个与类同名的方法,
那么这个方法就成为这个类的构造函数,这个没有什么疑问。

问题在于,当出现继承时,就有点麻烦了!

PHP3 中对于构造函数的定义是:
"与类同名的方法"

当子类从父类中派生出来后,创建子类的实例,如果在有方法与
子类同名,那么不管这个方法是在父类中定义的,还是在子类中
定义的,这个方法都会成为子类的构造函数。

[php]
<?php
// 父类
class vehicle
{
// 父类构造函数
function vehicle()
{
print "这里是 vehicle 类的构造函数";
}

function bus()
{
print "我是一辆 bus";
}
}

class bus extends vehicle
{
function Car()
{
print "这里是一辆 Car";
}
}

$ins = new bus();
?>
[/php]

这时父类中定义的 vehicle() 方法将成为子类 bus 的构造函数。

我的机器上面没有 PHP3, 我也懒得去验证,反正 PHP3 已经成为
历史了,就让它去吧~

关键看看 PHP4 吧~

按照官方手册的说法, PHP4 中构造函数定义有了新的变化。
“在该类中定义的,并与这个类同名的方法”

换句话说,如果父类中有个方法与其派生类同名,那么这个方法
将不会成为这个派生类的构造函数(但在 PHP3 中将成为子类的
构造函数)。

并且如果子类中没有定义构造函数,那么创建子类的实例时,将
自动调用父类的构造函数,如果父类有构造函数的话。

问题来了~
我发现这个定义似乎不太灵验啊~

看下面的例子 还是刚才那个例子

[php]
<?php
// 父类
class vehicle
{
// 父类构造函数
function vehicle()
{
print "这里是 vehicle 类的构造函数";
}

function bus()
{
print "我是一辆 bus";
}
}

class bus extends vehicle
{
function Car()
{
print "这里是一辆 Car";
}
}

$ins = new bus();
?>
[/php]

按照 PHP4 中的定义,这里将不会输出任何东西。
因为在子类中并没有定义 bus() 方法。

可是我运行这个代码的时候,却发现它调用了 vehicle 类的 bus()
方法。

也就是说 PHP 4 中构造函数的定义是错的。

PHP4 和 PHP3 一样,不同的是, PHP4 中如果子类没有定义
自己的构造函数会自动调用父类的构造函数(这一点没有错,
测试过了,大家把 vehicle 中的 bus() 去掉运行就可以看出来
了,程序调用了父类的 vehicle() 方法)。

我自己也不是太肯定,大家把这个例子运行一下,然后看看
PHP 4 手册中关于构造函数的叙述,我英文不是太好,大家看看
吧~



逛论坛交流关于 PHP4 中构造函数的一点点疑惑~

加入书签
digg+,
reddit+,
del.icio.us+,
dzone+

3 条回复

回复

我试试。。。记得以前做过类似实验,没.. 发表人 KnightE 发表于 08月07日
[php] class A { function A() .. 发表人 Verdana 发表于 08月07日
QUOTE: 发表人 KnightE 发表于 08月07日
  1. 我试试。。。记得以前做过类似实验,没发现问题呢

  2. [php] class A { function A() { echo "I am the constructor of A.
    "; } function B() { echo "I am a regular function named B in class A.
    "; echo "I am not a constructor in A.
    "; } } class B extends A { function C() { echo "I am a regular function.
    "; } } // This will call B() as a constructor. $b = new B; [/php] 运行一下这个例子吧~ 手册上面说会输出 I am the constructor of A.
    但是我运行了,却输出 I am a regular function named B in class A.
    I am not a constructor in A.
    我在 ZDE 里面调试的, PHP 4.2.1 换到 WEB Server 中也是一样。 APACHE with PHP 4.3.3 - Dev


  3. QUOTE:




  4. 我有话要讲:(可以匿名发表, 发广告的有多远请滚多远!!!)

    昵称: 请输入验证码:


  5. 抢着回答

    #在php中什么意思?

    up

    看网页的时候!?

    该页无法显示 您要查看的页当前不可用。网站可能遇到技术问题...

    找到错误,不知如何解决,高手请进

    我那个MYSQL错误是因为没有找到文件,我在本地用的是windows,而...

    这是什么怪现象,谁来解释一下

    下图中有两个文档,右面的文档是正常的文档,左面的文档本身是好...

    How to get file string?

    Such as I have a folder that has many files, I need to read ...

    欢迎加入slq基地

    目的:[/SIZE]为了广大热爱SQL的朋友有一个畅所欲言的地方, SQL...

    请问我想在我们的局域网里面建个php论坛...

    大家有什么好建议的,无所谓要什么发邮件功能。 大家用过什...

    希望村民们把qq留在这里,方便联系。我...

    希望村民们把qq留在这里,方便联系。我的16683663

    有没有关于类的教程

    下午看了一下,类这个老是看不懂,有没有详细点的教程?

    年龄计算问题

    计算年龄时我用这个函数获得年龄 function get_age($birth){ ...

    []