Php 将文件包含到命名空间中
我正在与Magento合作,但这不是Magento的具体问题 假设您正在使用foo.php,其中包含类foo。在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 将文件包含到命名空间中,php,class,magento,namespaces,include,Php,Class,Magento,Namespaces,Include,我正在与Magento合作,但这不是Magento的具体问题 假设您正在使用foo.php,其中包含类foo。在Magento中,如果存在/local/foo.php,则将包括它,否则将包括/core/foo.php。在这两种语言中,都定义了Foo类。这里的问题是两个文件都包含类Foo,因此/local/Foo.php中的类无法扩展/core/Foo.php中的类。最终,这需要将/core/foo.php中的所有代码复制到/local/foo.php中,减去我的自定义项 /core/foo.ph
/local/foo_include.php
<?php
namespace mage {
require '../core/foo.php;
}
?>
上面所说的不起作用,说明mage\Foo不存在。(如果核心Foo类是在Foo_include中定义的,而不是通过include引入的,那么它就可以工作
有什么方法是我遗漏的吗?通常,当我看到这样的事情时,我觉得这种方法不正确,需要从更高的角度来审视问题。也就是说,如果这是一种黑客行为,你知道的,这种对你的黑客行为的调整会起作用。但是,我不推荐任何一种方法
将foo_include.php更改为:
eval('namespace Mage {?>'.file_get_contents(__DIR__ . '/../core/foo.php').'}');
我不确定Magento是如何工作的,但对于Symfony,正确的解决方案是通过参数覆盖依赖项的类
Magento中是否有类似的内容?然后您可以用您的类重写该类,并扩展另一个。这仍然意味着它们需要位于不同的名称空间中,但是框架不会尝试转到\Foo,因为您重写了它。例如:
# original class for a dependency
dependency.class = \Foo
# overriden with new class
dependency.class = My\Foo
然后在您的Foo版本中:
class My\Foo extends \Foo {}
我不喜欢这样做,但在我知道更好的解决方案之前,eval()就是!哦,这太脏了:-DMagento 1硬编码了许多类的静态用法,因此您不能简单地扩展类并在需要时传递新的类实例(或在配置中更改它).由于Magento具有这些静态用法,因此您的类的命名必须与Magento中的类完全相同。
# original class for a dependency
dependency.class = \Foo
# overriden with new class
dependency.class = My\Foo
class My\Foo extends \Foo {}