我在两个不同的文件中有两个名为test
的类,例如a.php
和b.php
,逻辑是这样的:
include('a.php');
$a = new test();
if($somcondition_is_met)
{
include('b.php');
$b = new test();
}
是否有一些技巧可以避免Fatal error: Cannot redeclare class
?
答案 0 :(得分:2)
答案 1 :(得分:1)
classkit_import()看起来就像你想要的那样
http://www.php.net/manual/en/function.classkit-import.php
从链接:
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