【问题标题】:Error when using SplClassLoader使用 SplClassLoader 时出错
【发布时间】:2013-01-13 12:56:53
【问题描述】:

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

【问题讨论】:

  • 能否看到 index.php 的第 17 行?您是否在 index.php 中使用了任何“使用”语句?
  • @DavidHamp 查看我原来问题的更新。我的调用正上方有一个 use 语句来实例化我的类。
  • 您是否尝试过在您的 SplClassLoader 实例化中指定更明确的包含路径? ('/root/f1/f2/APS/Common')
  • @DavidHamp 不,我没有......所以它看起来像这个新的 SplClassLoader('APS\Common', '/f1/f2/APS/Common') ?

标签: php autoloader spl-autoloader


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 我认为命名空间必须反映目录结构?如果我将命名空间放入我的 index.php 文件中,那么,如果我想在该包之外实例化类,会不会令人困惑。奇怪的是,这非常令人困惑。
    • 是的。最好直接通过别名或全名(即Common\Group\APS\Common\Group)引用命名空间。
    • 这是参考我原帖中的更新 #4 吗?
    猜你喜欢
    • 1970-01-01
    • 2012-03-14
    • 2013-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-11
    相关资源
    最近更新 更多