在PHP中是否有动态覆盖类的技巧?

时间:2010-03-11 05:31:48

标签: php class override

我在两个不同的文件中有两个名为test的类,例如a.phpb.php,逻辑是这样的:

include('a.php');
$a = new test();
if($somcondition_is_met)
{
    include('b.php');
    $b = new test();
}

是否有一些技巧可以避免Fatal error: Cannot redeclare class

4 个答案:

答案 0 :(得分:2)

答案 1 :(得分:1)

classkit_import()看起来就像你想要的那样

http://www.php.net/manual/en/function.classkit-import.php

从链接:

示例#1 classkit_import()示例

newclass.php

<?php
class Example {
    function foo() {
        return "bar!\n";
    }
}
?>

main.php

<?php
// requires newclass.php (see above)
class Example {
    function foo() {
        return "foo!\n";
    }
}

$e = new Example();

// output original
echo $e->foo();

// import replacement method
classkit_import('newclass.php');

// output imported
echo $e->foo();

?>

以上示例将输出: FOO! 吧!

答案 2 :(得分:1)

使用“标准”PHP,不,你不能做这样的事情。


不过,看看PECL和手册,可能会使用 classkit extension - 但它被标记为“ not maintain ”,并且还没有自2004年以来更新......所以我绝对不会使用它。

引用该扩展程序的PECL页面:

  

注意:这个包已经   停止即可。请参考   runkit包,它完全是BC   classkit并包含其他内容   功能。


所以,让我们来看看 runkit extension ,这可能会有所帮助 - 尤其是runkit_import函数可能会让您感兴趣(引用)

  

类似于include()但是任何   代码驻留在函数之外或   类被忽略了。另外,   取决于旗帜的价值,   当前正在运行的任何函数或类   环境将自动进行   被新人覆盖   定义

不过,请注意,正式(查看它的PECL page,自2006年以来,runkit扩展程序尚未更新......这也不是一个好兆头...特别是说到PHP 5.3支持......

答案 3 :(得分:0)

我认为最好使用Interfaces,而不是动态覆盖类。

在您的代码中,您引用/使用接口类,而不是您可以拥有多个实现该接口的类。

检查文档以获取有关接口的更多详细信息。 http://php.net/manual/en/language.oop5.interfaces.php