Я использую классы с Wordpress и пытаюсь автоматически загрузить их в свой файл functions.php
:
spl_autoload_register(function($class) {
include('classes/'.$class.'.php');
});
Вот как выглядит мой каталог классов:
- classes/
- project/
- Application.php
- Core.php
- Сайт.php
- Helpers.php
- utils/
- Helpers.php
- Twig.php
- views/
- Layout.php
- Модули.php
- pages/
- Home.php
- project/
Каждый класс имеет пространство имен в зависимости от каталога, в котором он находится. Например:
$homeClass = new \views\pages\Home();
Когда я автоматически загружаю классы, я получаю эту ошибку:
Предупреждение PHP: include(classes/project\Application.php): не удалось открыть поток: нет такого файла или каталога
Очевидно, что обратная косая черта, являющаяся частью пространства имен, не работает в пути. Я мог бы обновить свою функцию, чтобы заменить обратную косую черту прямой косой чертой следующим образом:
spl_autoload_register(function($class) {
include('classes/'.str_replace("\\", "/", $class).'.php');
});
Но кажется странным, что это необходимо. Я что-то упускаю?
spl_autoload_register()
встроен в PHP, но требует дополнительной функции (str_replace()
) для размещения пространств имен. Я бы предположил, чтоspl_autoload_register()
сможет добиться этого самостоятельно. - person Michael Lynch   schedule 07.07.2015spl_autoload_register
вообще ничего не знает о путях к файлам. Он даже не запускаетinclude
для вас, он просто дает вам полное имя класса, и вы можете делать все, что хотите, чтобы этот класс появился. Так что совсем не странно, что вам нужно манипулировать одной строкой (именем класса), чтобы превратить ее в другую строку (путь на диске в соответствии с вашим соглашением об именах). - person IMSoP   schedule 08.07.2015