Php 使用SplClassLoader时出错

Php 使用SplClassLoader时出错,php,autoloader,spl-autoloader,Php,Autoloader,Spl Autoloader,首先,我正在尝试使用下面的SplClassLoader- 以下是我的文件结构: /root/f1/f2/APS/Common/Group.php /root/f1/f2/index.php /root/f1/f2/SplClassLoader.php 下面是我的测试类Group(Group.php) 下面是调用所有内容的index.php文件: require "SplClassLoader.php"; $classLoader = new SplClassLoader('APS', 'APS

首先,我正在尝试使用下面的SplClassLoader-

以下是我的文件结构:

/root/f1/f2/APS/Common/Group.php
/root/f1/f2/index.php
/root/f1/f2/SplClassLoader.php
下面是我的测试类Group(Group.php)

下面是调用所有内容的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 

当使用
use
语句时(不要使用双关语),只需为所使用的名称空间或类创建一个别名。根据,
使用\Foo\Bar
相当于
使用\Foo\Bar作为Bar

因此,在本例中,您将导入别名为
Common
APS\Common
命名空间。这意味着您可以将此命名空间中的
Group
类称为
Common\Group
,而不是
APS\Common\Group
。如果不使用名称空间别名(正如您所做的那样),类加载器将期望
类位于全局名称空间中(并且期望该类存储在
/root/f1/f2/Group.php
中)


编辑:另一种可能是简单地将
名称空间\APS\Common编码到您的文件中。如果引用一个没有名称空间规范的类(即
Group
而不是
\Group
\APS\Common
),PHP会希望该类位于当前名称空间中。

在我的例子中,这是一个似乎有效的解决方案

require "SplClassLoader.php";
$classLoader = new SplClassLoader('APS\Common', __DIR__);
$classLoader->register();

use APS\Common;
$x = new Common\Group();

我必须使用魔法常数DIR才能工作。第二个参数似乎需要指向类所在的根的物理路径。然后,添加名称空间以在文件系统中定位它们。

是否可以看到index.php的第17行?您是否在index.php中使用了任何“use”语句?@DavidHamp请参阅我原始问题的更新。我的调用上方有一个use语句来实例化我的类。您是否尝试在SplClassLoader实例化中指定更显式的包含路径?('/root/f1/f2/APS/Common')@DavidHamp不,我没有。。。所以它看起来像这个新的SplClassLoader('APS\Common','f1/f2/APS/Common')?我认为名称空间必须反映目录结构?如果我在index.php文件中放了一个名称空间,那么,如果我想在该包之外实例化类,这难道不会让人感到困惑吗。奇怪的是,这是非常令人困惑的。最好通过别名或全名直接引用名称空间(即
Common\Group
\APS\Common\Group
)。这是指在我的原始帖子中更新#4吗?
require "SplClassLoader.php";
$classLoader = new SplClassLoader('APS\Common', __DIR__);
$classLoader->register();

use APS\Common;
$x = new Common\Group();