在另一个命名空间中使用相同的 class 覆盖 object 创建

Override object creation with same class in another namespace

我在尝试创建特定的 class.

时试图欺骗 PHP 从另一个名称空间获取 class

我有两个 class 叫做 "page",第一个在核心命名空间中:

namespace Core;
class Page {...}

第二个继承自 Core\Page,但添加了一些内容。它位于 Addons 命名空间中。

namespace Addons;
class Page extends \Core\Page{...}

我想这样做的原因是因为我想用一个简单的插件引擎来构建我的系统。无论何时,我都可以在 XML 文件中添加一行,告诉自动加载函数在插件命名空间而不是核心命名空间中使用 class。

但是,当我尝试这样做时:

spl_autoload_register('loadClass');

public function loadClass(string $className)
{
    if (Addon_exist_and_is_registered($className))
    {
        require "/Addons/$className.php";
    }
    else
    {
        require "/Core/$className.php";
    }
}

$page = new \Core\Page(); <-- error here

我收到一条错误消息,提示无法在文件 Addons\Page.php 中找到 class \Core\Page。这是正常行为,因为 class 不在同一个命名空间中,因此,完全限定名称找不到正确的 class.

是否可以欺骗 PHP 认为另一个名称空间中的 child class 实际上是正确的 class?我为插件试过这个 class;

namespace Core;
class Page extends \Core\Page{...}

但是它破坏了继承,因为你不能继承自己。

忽略 classes 有 "same name"。因为他们没有。一个 class 称为 Core\Page,另一个称为 Addons\Page这些是他们的名字,准确地说是他们的完全限定名字。这与 FooBar 一样大。如果你告诉 PHP 实例化 Core\Page,那么它就会这样做;您不能 "trick" 将其实例化 Addons\Page,因为那是一个完全不同的 class 名称。

不要试图 "trick" 任何人,让您的系统真正可扩展并明确允许覆盖 class 名称:

$class = 'Core\Page';
if (...) {
    $class = 'Addons\Page';
}

$page = new $class;