2

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

2 回答 2

0

使用该use语句(没有双关语)时,您只需为使用的命名空间或类创建一个别名。根据PHP 手册use \Foo\Bar;相当于use \Foo\Bar as Bar;.

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

编辑:另一种可能性是简单地namespace \APS\Common;放入您的文件中。如果您引用一个没有命名空间规范的类(即Group代替\Groupor \APS\Common),PHP 将期望该类位于当前命名空间中。

于 2013-01-29T21:00:37.340 回答
0

就我而言,这是似乎可行的解决方案。

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

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

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

于 2013-01-30T14:27:34.723 回答