【问题标题】:PHP Autoloading with SplClassLoader?使用 SplClassLoader 自动加载 PHP?
【发布时间】:2012-03-14 11:12:54
【问题描述】:

我正在学习 PHP 5.3 中的命名空间,我想使用命名空间自动加载。我找到了这个SplClassLoader class,但我不知道它是如何工作的。

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

system
  - framework
    - http
      - request.php
      - response.php
index.php
SplClassLoader.php

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

这是request.php

namespace framework\http;

class Request
{
    public function __construct()
    {
        echo __CLASS__ . " constructer!";
    }
} 

这是response.php

namespace framework\http;

class Request
{            
    public function __construct()
    {      
        echo __CLASS__ . " constructed!";                
    }           
}   

index.php 我有:

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

$r = new Request();

我收到此错误消息:

Fatal error: Class 'Request' not found in C:\wamp\apache\htdocs\php_autoloading\index.php on line 8

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

【问题讨论】:

  • 我认为您的文件和目录名称可能需要以大写字母开头?
  • @Adrian Macneil:不在 Windows 中,但你是对的,应该这样做。

标签: php autoload spl-autoloader


【解决方案1】:

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

system
  - framework
    - http
      - Request.php
      - Response.php
index.php
SplClassLoader.php

另外,注册SplClassLoader对象时只需要声明根命名空间,如下:

<?php

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

    use framework\http\Request;

    $r = new Request();

?>

希望这会有所帮助!

【讨论】:

  • 我认为 use framework\http\Request; 在您引用 new Request() 之前是必需的……除非我遗漏了什么。
  • @MarkFox 已编辑修复。感谢您的提醒。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-08
  • 2013-01-13
  • 2012-10-31
  • 2021-03-18
  • 1970-01-01
相关资源
最近更新 更多