Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 将文件包含到命名空间中_Php_Class_Magento_Namespaces_Include - Fatal编程技术网

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

我正在与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-我无法更改此文件


/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 {}