首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将文件包含到命名空间中

将文件包含到命名空间中
EN

Stack Overflow用户
提问于 2014-03-19 22:27:06
回答 1查看 3.9K关注 0票数 7

我在和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 -我不能更改这个文件!

代码语言:javascript
复制
<?php
class Foo {
    public function test() {
        echo 'core/foo.php :: Foo :: test';
    }
}
?>

/local/foo_include.php

代码语言:javascript
复制
<?php
namespace mage {
    require '../core/foo.php;
}
?>

/local/foo.php -我不能在这个文件中放一个名称空间,因为我无法控制实例化这个类的文件。

代码语言:javascript
复制
<?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中定义的,而不是通过包含引入的话,就可以工作了。

我错过了什么办法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-20 02:28:52

通常,当我看到这样的事情时,我觉得这种方法是不正确的,需要从更高的角度来研究这个问题。尽管如此,如果这是一个黑客,你知道,这个调整你的黑客将有效。但同样,我不推荐这两种方法。

将foo_include.php更改为:

代码语言:javascript
复制
eval('namespace Mage {?>'.file_get_contents(__DIR__ . '/../core/foo.php').'}');

我不知道Magento是如何工作的,但是对于Symfony,正确的解决方案是通过参数覆盖依赖项的类。

http://symfony.com/doc/current/cookbook/bundles/override.html

马根托有类似的东西吗?然后,您可以使用类重写类,并扩展另一个类。这仍然意味着它们需要在不同的名称空间中,但是框架不会尝试转到\Foo,因为您重写了它。像这样:

代码语言:javascript
复制
# original class for a dependency
dependency.class = \Foo

# overriden with new class
dependency.class = My\Foo

那么在你的Foo版本中:

代码语言:javascript
复制
class My\Foo extends \Foo {}
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22519486

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档