С современным PHP вызов
spl_autoload_register();
позволяет вам создавать экземпляры новых классов без необходимости указывать REQUIRE, INCLUDE или USE в ваших файлах php, если у них есть пространство имен, и пока это пространство имен соответствует структуре папок/файлов, такой как:
|--models
|-- utility
| |___calculator.php
|
|
|--index.php
При такой настройке, если в calculate.php в верхней части объявлено "namespace models\utility" и он содержит класс Calculator (соответствует имени файла calculate.php), вы можете автоматически создать его экземпляр из index.php, вызвав:
calc = New models\utility\Calculator();
Однако, если структура папок такая:
|--models
|-- utility
| |___calculator.php
|
|
|--public
|--index.php
Теперь index.php больше не может получить доступ к калькулятору через свое пространство имен, так как index.php больше не находится в корневой папке.
Похоже, у public/index.php нет возможности достичь пространств имен выше его уровня. Это просто ограничение PHP. Есть ли способ зарегистрировать функцию с помощью spl_autoload_register, которая сохранит свое автоматическое, простое в работе поведение, но позволит index.php создавать экземпляры пространств имен выше уровня своей папки? Или другой способ справиться с этой ситуацией, при этом вам никогда не придется ИСПОЛЬЗОВАТЬ или ТРЕБУЕТ/ВКЛЮЧАТЬ файлы?
ОБНОВЛЕНИЕ С ОТВЕТОМ
Это решение, не зависящее от каталога, которое сработало для меня. Я могу успешно создавать экземпляры новых классов, просто вызывая их пространство имен, не прибегая к USE, REQUIRE или INCLUDE, даже если index.php был перемещен в папку /public.
//'/../../../../' points the autoloader.php file back to root directory
$include_path = realpath(dirname(__FILE__) . '/../../../../');
set_include_path($include_path);
spl_autoload_register();