使用SplClassLoader进行PHP自动加载?

Lim*_*eni 12 php autoload spl-autoloader

我正在学习PHP 5.3中的命名空间,我想使用命名空间自动加载.我找到了这个SplClassLoader类,但我无法弄清楚它是如何工作的.

假设我有这样的目录结构:

system
  - framework
    - http
      - request.php
      - response.php
index.php
SplClassLoader.php
Run Code Online (Sandbox Code Playgroud)

如何启用类自动加载?应该什么命名空间request.phpresponse.php有哪些?

这是request.php:

namespace framework\http;

class Request
{
    public function __construct()
    {
        echo __CLASS__ . " constructer!";
    }
} 
Run Code Online (Sandbox Code Playgroud)

这是response.php:

namespace framework\http;

class Request
{            
    public function __construct()
    {      
        echo __CLASS__ . " constructed!";                
    }           
}   
Run Code Online (Sandbox Code Playgroud)

index.php我有:

require_once("SplClassLoader.php");
$loader = new SplClassLoader('framework\http', 'system/framework');
$loader->register();

$r = new Request();
Run Code Online (Sandbox Code Playgroud)

我收到此错误消息:

Fatal error: Class 'Request' not found in C:\wamp\apache\htdocs\php_autoloading\index.php on line 8
Run Code Online (Sandbox Code Playgroud)

为什么这不起作用?如何SplClassLoader在我的项目中使用它以加载/需要我的类,我应该如何设置和命名文件夹和命名空间?

rin*_*aun 11

您的文件和目录名称必须与您的类和名称空间的大小写完全匹配,如下例所示:

system
  - framework
    - http
      - Request.php
      - Response.php
index.php
SplClassLoader.php
Run Code Online (Sandbox Code Playgroud)

此外,您只需在注册SplClassLoader对象时声明根命名空间,如下所示:

<?php

    require_once("SplClassLoader.php");
    $loader = new SplClassLoader('framework', 'system/framework');
    $loader->register();

    use framework\http\Request;

    $r = new Request();

?>
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!

  • 我认为在使用`new Request()`之前需要`使用framework\http\Request;`除非我遗漏了什么. (3认同)