将文件包含到命名空间中

时间:2014-03-19 22:27:06

标签: php class magento namespaces include

我正在和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引入,它确实有效。

我有什么方法可以解决这个问题吗?

1 个答案:

答案 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 {}