Как использовать spl_autload_register, не могу вернуть функцию?

Мне трудно заставить работать spl_autoload_register.

Текущая структура папок:

config/
      autoLoader.php
      dataBase.php

lib/
      userClass/
                user.php

web/
    userHomepage/
                 index.php  

config/autoLoader.php

spl_autoload_register(function($class)
{
    include_once $_SERVER['DOCUMENT_ROOT'] . '/project/lib/userClass/' . $class . '.ph';
});

lib/userClass/user.php

namespace userClass;

class userClass
{
    public function printName()
            { 
                echo 'Stackoverflow'
            }
}

web/userHomepage/index.php

include $_SERVER['DOCUMENT_ROOT'] . '/project/helpers/autoLoader.php';

$userClass = new userClass;

Хотя он не работает, он возвращает userClass not found. Эта проблема связана с тем, что пространство имен не печатается правильно, хотя вместо этого оно должно включать их путь? Я уже проверил веб-сайт php для получения помощи, но это не ясно, просмотрел каждый пост об этом, но ничего не указывает в правильном направлении!


person iBrazilian2    schedule 29.09.2013    source источник
comment
Вы отладили? Вы распечатали содержимое $class в своей функции автозагрузки, чтобы получить более четкое представление о том, что происходит? Я бы посоветовал вам придерживаться PSR-0 и использовать уже существующий автозагрузчик, вероятно, сгенерированный Composer.   -  person Sven    schedule 30.09.2013
comment
Я не думаю, что это возможно с вашей структурой каталогов и пространств имен - вам нужно, чтобы config, lib и web были частью пространства имен, чтобы вы могли использовать их в физическом пути к файлам.   -  person George Brighton    schedule 30.09.2013
comment
@GeorgeBrighton: Вы ошибаетесь. При правильной функции преобразования пространство имен и имя класса могут быть полностью независимы от физического пути к файлу, но это редко используется, потому что это может запутать разработчика. Но даже с PSR-0 ваше утверждение неверно - вы можете иметь несколько пространств имен в нескольких базовых каталогах, если хотите. Ключевым элементом является правильная функция автозагрузки. :)   -  person Sven    schedule 30.09.2013
comment
Несколько автозагрузчиков? Что бы ни случилось с принципом KISS...   -  person George Brighton    schedule 30.09.2013


Ответы (1)


Вероятно, ваш $_SERVER['DOCUMENT_ROOT'] указывает на папку web/userHomepage/. Если это так, то вы должны использовать

spl_autoload_register(function($class)
{
  require $_SERVER['DOCUMENT_ROOT'] . '/../../lib/userClass/' . $class . '.php';
});

И обновите путь autoLoader.php. И лучше использовать require вместо include. Затем вы увидите сообщение об ошибке, объясняющее проблему.

person Alex    schedule 29.09.2013