我在和Magento合作,但这不是Magento的具体问题。
假设您正在使用包含类Foo的foo.php。在Magento中,如果存在/local/foo.php,则包含/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();?>
以上都不起作用,说法师\Foo不存在。(如果核心Foo类是在foo_include中定义的,而不是通过包含引入的话,就可以工作了。
我错过了什么办法吗?
发布于 2014-03-20 02:28:52
通常,当我看到这样的事情时,我觉得这种方法是不正确的,需要从更高的角度来研究这个问题。尽管如此,如果这是一个黑客,你知道,这个调整你的黑客将有效。但同样,我不推荐这两种方法。
将foo_include.php更改为:
eval('namespace Mage {?>'.file_get_contents(__DIR__ . '/../core/foo.php').'}');我不知道Magento是如何工作的,但是对于Symfony,正确的解决方案是通过参数覆盖依赖项的类。
http://symfony.com/doc/current/cookbook/bundles/override.html
马根托有类似的东西吗?然后,您可以使用类重写类,并扩展另一个类。这仍然意味着它们需要在不同的名称空间中,但是框架不会尝试转到\Foo,因为您重写了它。像这样:
# original class for a dependency
dependency.class = \Foo
# overriden with new class
dependency.class = My\Foo那么在你的Foo版本中:
class My\Foo extends \Foo {}https://stackoverflow.com/questions/22519486
复制相似问题