无法覆盖 PHP 类/函数

3
我可以帮您进行翻译。以下是您需要翻译的内容:

我无法在本地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 with Suhosin-Patch (cli) (built: May 3 2011 00:48:48)

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

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


除非您告诉我们“不起作用”是什么意思。 - symcbean
2
正如edorian所说,它被视为PHP4构造函数,无法通过这种方式进行覆盖。 - Yousf
构造函数并不涉及。那是错误的。函数 HandsetDetection::HandsetDetection 是 PHP 4 风格的构造函数。参见:函数名称 = 类名。 - hakre
1
@David Oliver:你需要给扩展类另一个方法,然后情况应该如你所需,参见我的回答 - hakre
2个回答

11

我认为这可能与该类与方法同名有关。

这是php4风格的构造函数

只要该类不在命名空间中,这仍然是个问题。

出于向后兼容性考虑,如果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"


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的答案,其中包含手册等链接。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接