Автозагрузка PHP с помощью SplClassLoader?

Я изучаю пространства имен в PHP 5.3 и хотел бы использовать автозагрузку пространств имен. Я нашел этот класс SplClassLoader, но не могу понять, как он работает.

Допустим, у меня есть такая структура каталогов:

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

Как включить автозагрузку классов? Какие пространства имен должны быть у request.php и response.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 в своих проектах, чтобы он загружал/требовал мои классы, и как мне настроить и назвать папки и пространства имен?


person Limeni    schedule 23.02.2012    source источник
comment
Я думаю, что имена ваших файлов и каталогов должны начинаться с заглавных букв?   -  person Adrian Macneil    schedule 06.03.2012
comment
@Adrian Macneil: Не в Windows, но вы правы, это нужно сделать.   -  person hakre    schedule 31.05.2012


Ответы (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();

?>

Надеюсь это поможет!

person rintaun    schedule 24.05.2012
comment
Я думаю, что use framework\http\Request; необходимо, прежде чем ссылаться на new Request()… если я что-то не упустил. - person Mark Fox; 23.04.2013
comment
@MarkFox Отредактировано, чтобы исправить. Спасибо за предупреждение. - person rintaun; 23.04.2013