无法覆盖PHP类/函数

时间:2011-07-19 11:58:12

标签: php oop function override function-overriding

我无法在本地Ubuntu测试LAMP服务器上覆盖子类中的函数,但是在上传到Web服务器时,相同的代码会导致所需的覆盖。

原班级:

class HandsetDetection {
    function HandsetDetection() {
        //code I wish to replace
    }
}

我的课程:

class HandsetDetection_RespondHD extends HandsetDetection {
    function HandsetDetection() {
        //code I wish to use
    }
}

不参与构造函数。

我本地计算机上使用的PHP版本是PHP 5.3.3-1ubuntu9.5,带有Suhosin-Patch(cli)(内置:2011年5月3日00:48:48)

覆盖成功的Web服务器上的PHP版本是5.2.17

你能想到为什么会这样吗?

2 个答案:

答案 0 :(得分:11)

我认为这与该类与方法具有相同名称的事实有关。

这是一个php4风格constructor

只要该类不在仍然存在问题的命名空间中。

  

为了向后兼容,如果PHP 5找不到给定类的__construct()函数,它将按类的名称搜索旧式构造函数。实际上,这意味着唯一具有兼容性问题的情况是该类是否有一个名为__construct()的方法,该方法用于不同的语义。


实施例

<?php


class A {

    function A() {
        echo "construct";
    }
}

class B extends A {

    function A() {
        echo "override";
    }

}

$x = new B();

这将输出"construct"

现在正在呼叫

$x->A();

将输出"override"

答案 1 :(得分:2)

通过为扩展类提供构造函数方法(Demo)来替换HandsetDetection() /阻止它被调用:

<?php

class A {

    function A() {
        echo "A() constructor\n";
    }
}

class B extends A {

    function __construct() {
        echo 'B() constructor', "\n";
    }

    function A() {
        echo "override\n";
    }

}

$x = new B();

然后情况应该好转。有关背景信息的说明,请参阅@edorians回答,并附上手册链接等。