【发布时间】:2016-11-11 04:04:43
【问题描述】:
当我试图创建一个特定的类时,我试图欺骗 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{...}
但它破坏了继承,因为你不能继承自己。
【问题讨论】:
-
问题是你必须包含 both 类才能使
Addons\Page工作。没有办法解决它。
标签: php namespaces autoload