我无法在本地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
你能想到为什么会这样吗?
答案 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回答,并附上手册链接等。