【问题标题】:Include file into a namespace将文件包含到命名空间中
【发布时间】:2014-04-26 12:03:06
【问题描述】:

我正在使用 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();

?>

上面的不行,说mage\Foo不存在。 (如果核心 Foo 类是在 foo_include 中定义而不是通过包含引入的,它确实有效。

有什么办法可以解决我想念的吗?

【问题讨论】:

    标签: php class magento namespaces include


    【解决方案1】:

    通常当我看到这样的事情时,我觉得方法不对,需要从更高的角度审视问题。也就是说,如果这是一个 hack 并且您知道这一点,那么对您的 hack 的这种调整将起作用。但同样,我不推荐任何一种方法。

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

    【讨论】:

    • 我讨厌这样做,但在我知道更好的解决方案之前,eval() 就是这样!
    • 哦,那很脏:-D
    • Magento 1 硬编码了类的许多静态用法,因此您不能简单地扩展类并在需要的地方传递新的类实例(或在配置中更改它)。由于 Magento 具有这些静态用法,因此您的类的名称必须与 Magento 中的完全一样。
    猜你喜欢
    • 2011-07-24
    • 1970-01-01
    • 1970-01-01
    • 2019-08-24
    • 2014-03-22
    • 1970-01-01
    • 2014-06-24
    • 2017-01-13
    相关资源
    最近更新 更多