поведение пространства имен spl_autoload_register() по умолчанию с index.php вне корня

С современным 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();

person R.M.D    schedule 10.02.2018    source источник
comment
Вы можете просто использовать композитор, который поставляется с Автозагрузчик PSR-4   -  person apokryfos    schedule 10.02.2018


Ответы (1)


Когда функция spl_autoload_register() вызывается без аргумента $autoload_function, функция автозагрузки по умолчанию spl_autoload().

Функция spl_autoload() проверяет все включите пути к файлу, сопоставление пространств имен с папками и имен классов с файлами, как вы уже заметили.

Ключевым моментом для вас является убедиться, что папка, содержащая структуру каталогов с вашими файлами классов (т. е. каталог, содержащий models), находится на пути включения. Обычно это делается с помощью функции set_include_path().

person salathe    schedule 10.02.2018
comment
Большое спасибо, Салате, я обновил свой вопрос, чтобы дать ваш ответ - person R.M.D; 10.02.2018