在另一个命名空间中使用相同的类重写对象创建


Override object creation with same class in another namespace

我试图欺骗PHP在尝试创建特定类时从另一个命名空间获取一个类。

我有两个叫做"page"的类,第一个在 Core 命名空间中:

namespace Core;
class Page {...}

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

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

我想这样做的原因是因为我想用一个简单的插件引擎来构建我的系统。只要我愿意,我就可以在 XML 文件中添加一行,告诉自动加载函数在 addon 命名空间而不是核心命名空间中获取类。

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

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

我收到一个错误,说在文件插件''Page.php中找不到类''核心''页面。这是正常行为,因为类不在同一命名空间中,因此,完全限定名找不到正确的类。

是否有可能欺骗PHP认为另一个命名空间中的子类实际上是正确的类?我为插件类尝试了这个;

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

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

忽略这些类具有"相同的名称"。因为他们没有。一个类叫Core'Page,另一个叫Addons'Page。这些是他们的名字,确切地说是他们完全限定的名字。这和FooBar一样大。如果你告诉 PHP 实例化Core'Page,那么它就会这样做;你不能"欺骗"它实例化Addons'Page,因为这是一个完全不同的类名。

不要试图"欺骗"任何人,使您的系统实际上可扩展并明确允许覆盖类名:

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