我正在和Magento合作,但这不是Magento特有的问题。
假设您正在使用包含Foo类的foo.php。在Magento中,如果存在/local/foo.php将被包括在内,否则将包含/core/foo.php。在两者中,定义了类Foo。这里的问题是两个文件都包含类Foo,因此/local/foo.php中的类不能扩展/core/foo.php中的类。最终,这需要将/core/foo.php中的所有代码复制到/local/foo.php中,减去我的自定义。
/core/foo.php - 我无法更改此文件!
<?php
class Foo {
public function test() {
echo 'core/foo.php :: Foo :: test';
}
}
?>
/local/foo_include.php
<?php
namespace mage {
require '../core/foo.php;
}
?>
/local/foo.php - 我无法在此文件中放置命名空间,因为我无法控制实例化此类的文件。
<?php
require './foo_include.php';
use mage;
class Foo extends mage\Foo {
function __construct() {
var_dump('Un-namespaced Foo!');
}
}
$foo = new Foo();
$foo->test();
&GT;
以上不起作用,说mage \ Foo不存在。 (如果核心Foo类在foo_include中定义而不是通过include引入,它确实有效。
我有什么方法可以解决这个问题吗?
答案 0 :(得分:4)
通常当我看到这样的事情时,我觉得这种方法不对,需要在更高的视角检查问题。也就是说,如果这是一个黑客而且你知道,那么对你的黑客的调整就可以了。但同样,我不推荐任何一种方法。
将foo_include.php更改为:
eval('namespace Mage {?>'.file_get_contents(__DIR__ . '/../core/foo.php').'}');
我不确定Magento是如何工作的,但是使用Symfony,正确的解决方案是通过参数覆盖依赖关系的类。
http://symfony.com/doc/current/cookbook/bundles/override.html
Magento有类似的东西吗?然后,您可以使用您的类覆盖该类,并扩展另一个类。这仍然意味着他们需要处于不同的名称空间中,但是框架不会尝试转到\ Foo,因为你覆盖了它。像这样:
# original class for a dependency
dependency.class = \Foo
# overriden with new class
dependency.class = My\Foo
然后在你的Foo版本中:
class My\Foo extends \Foo {}