4

我今天正在学习如何使用命名空间和自动加载PHP,我似乎遇到了障碍。当我不使用spl_autoload_register但相反时,事情似乎起作用了require_once

我的文件夹结构很少:

- index.php
- class/
  - Users.php

在我的index.php文件中,我有:

<?php
require_once('class/Users.php');

echo User::get(1);

在我的class/Users.php文件中,我有:

<?php

Class User {
    function get($id) {
        return $id;
    }
}

这工作得很好,返回的ID1

理想情况下,我会想使用自动加载功能,我发现spl_autoload_*这是我试图做的,但没有成功:

在我的class/Users.php文件中,我有:

<?php
namespace Users; // Added a namespace

Class User {
    function get($id) {
        return $id;
    }
}

在我的index.php文件中,我有:

<?php
// Changed to using spl_autoload_register using an anonymous function to load the class 
spl_autoload_register(function($class){
    include('class/' . $class . '.php');
});

echo Users\User::get(1); // Added the Users namespace

但我收到一个错误:

`Class 'Users\User' not found in /Applications/MAMP/htdocs/index.php on line 7`

不太确定我做错了什么。

4

2 回答 2

1

我认为您应该在命名空间路径的前面添加 \。

例子

\Users\User::get(1);

如果您必须使用基本路径,例如 Traversable() 您还需要这样做

new \Traversable()
于 2012-09-06T11:06:33.987 回答
1

使用完整的类名作为参数调用自动加载器,包括命名空间。在您的示例中,这是Users\User,所以您最终会这样做

include('class/Users\User.php');

这失败了,因为类定义不在一个名为的目录中Users(顺便说一下,include会发出一个警告,它找不到包含扩展文件名的文件,这个警告会让事情变得更清楚——你是否禁用了错误报告?)

当找不到文件时让自动加载器在现场发生故障可能是一个好主意,这样故障模式就会更加明显。例如,您可以将其更改为

require('class/' . $class . '.php'); // require will end the script if file not found

或类似的东西

$result = @include('class/' . $class . '.php'); // see documentation for include
if ($result === false) {
    die("Could not include: 'class/$class.php'");
}
于 2012-09-06T11:10:29.553 回答