使用SplClassLoader时出错

时间:2013-01-29 20:29:38

标签: php autoloader spl-autoloader

首先,我正在尝试使用以下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 - 配置信息

  • Apache / 2.2.15(红帽)
  • PHP 5.3.3

更新#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 

2 个答案:

答案 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 才能工作。第二个参数似乎需要指向类所在的根的物理路径。然后,添加名称空间以在文件系统中找到它们。