首先,我正在尝试使用以下SplClassLoader - https://gist.github.com/221634
这是我的文件结构:
/root/f1/f2/APS/Common/Group.php
/root/f1/f2/index.php
/root/f1/f2/SplClassLoader.php
这是我的测试类Group(Group.php)
namespace APS\Common;
class Group{
...
}
这是调用所有内容的index.php文件:
require "SplClassLoader.php";
$classLoader = new SplClassLoader('APS', 'APS/Common');
$classLoader->register();
我收到以下错误:
Fatal error: Class 'Group' not found in /root/f1/f2/index.php on line 17
在将命名空间和路径传递给加载器时,我尝试了所有可能的组合。它永远不会奏效。
更新#1 - index.php中的第17行:
16: use APS\Common;
17: $x = new Group();
更新#2 - 配置信息
更新#3 - 我现在收到了不同的错误消息。
代码:
require "SplClassLoader.php";
$classLoader = new SplClassLoader('APS', '/root/f1/f2');
$classLoader->register();
use APS\Common;
$x = new Common\Group();
我收到的错误消息:
Warning: require(/f1/f2/APS/Common/Group.php): failed to open stream: No such file or directory in /root/f1/f2/SplClassLoader.php on line 133
答案 0 :(得分:0)
使用use
语句(无双关语)时,只需为使用的命名空间或类创建别名即可。根据{{3}},use \Foo\Bar;
相当于use \Foo\Bar as Bar;
。
因此,在您的情况下,您使用别名APS\Common
导入Common
命名空间。这意味着您可以将此命名空间中的Group
类称为Common\Group
,而不是APS\Common\Group
。在不使用命名空间别名的情况下(如您所做),类加载器将期望Group
类位于全局命名空间中(并期望该类存储在/root/f1/f2/Group.php
中)。
修改:另一种可能性就是将namespace \APS\Common;
放入您的文件中。如果您引用没有命名空间规范的类(即Group
而不是\Group
或\APS\Common
),PHP将期望该类位于当前命名空间中。
答案 1 :(得分:0)
就我而言,这里的解决方案似乎有效。
require "SplClassLoader.php";
$classLoader = new SplClassLoader('APS\Common', __DIR__);
$classLoader->register();
use APS\Common;
$x = new Common\Group();
我必须使用魔法常量 DIR 才能工作。第二个参数似乎需要指向类所在的根的物理路径。然后,添加名称空间以在文件系统中找到它们。