Php 使用SplClassLoader时出错
首先,我正在尝试使用下面的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
/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
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();