gpt4 book ai didi

php - 使用另一个命名空间中的相同类覆盖对象创建

转载 作者:行者123 更新时间:2023-12-04 16:54:38 25 4
gpt4 key购买 nike

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

我有两个名为“page”的类,第一个在 Core 命名空间中:

namespace Core;
class Page {...}

第二个继承自 Core\Page,但添加了一些东西。它位于 Addons 命名空间中。
namespace Addons;
class Page extends \Core\Page{...}

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

但是,当我尝试这样做时:
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 文件中找不到类\Core\Page。这是正常行为,因为该类不在同一个命名空间中,因此,完全限定名称无法找到正确的类。

是否有可能诱使 PHP 认为另一个命名空间中的子类实际上是正确的类?我为插件类尝试了这个;
namespace Core;
class Page extends \Core\Page{...}

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

最佳答案

忽略这些类具有“相同的名称”。因为他们没有。一类叫做Core\Page ,另一个叫Addons\Page . 这些是他们的名字 ,准确地说是它们的完全限定名称。与Foo 相差无几和 Bar .如果你告诉 PHP 实例化 Core\Page ,那么它就会这样做;你不能“欺骗”它实例化 Addons\Page ,因为这是一个完全不同的类名。

不要试图“欺骗”任何人,让你的系统真正可扩展并明确允许覆盖类名:

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

$page = new $class;

关于php - 使用另一个命名空间中的相同类覆盖对象创建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38269152/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com