Может php spl_autoload_register & amp; автозагрузчик композитора работает вместе?

После небольшого исследования так и не удалось найти решение моей проблемы. Я использую API, который является пространствами имен, которые я загрузил через композитора. У API есть зависимости, которые я позволяю композитору управлять и автоматически загружать для меня. Помимо этого у меня есть около 10 классов, которые я автоматически загрузил с использованием php spl_autoload_register, Недавно я начал смешивать классы, чтобы закончить часть проекта, и все пошло к чёрту. Мои пользовательские классы не могут использовать классы композитора и наоборот. Есть ли способ, который я могу использовать для автозагрузки классов, которые находятся в двух отдельных папках и которые загружаются с двумя отдельными загрузчиками.

Вот код, который я сейчас использую. Vender / autoload.php ничем не отличается от вашего обычного автозагрузчика композитора. Спасибо за любую помощь.

require 'vendor/autoload.php';
require 'functions/general.php';
require 'include/mailgun.php';

function my_autoloader($class) {
require 'classes/' . $class . '.php';
}
spl_autoload_register('my_autoloader');

9

Решение

Ну, на самом деле композитор использует spl_autoload_registerтак что ответ «да», они могут. Механизм автозагрузки поддерживается стек автозагрузчика — в основном, если класс не появился во время выполнения после запуска одного автозагрузчика, используется следующий, пока в стеке не закончатся автозагрузчики и PHP не сообщит об ошибке о классе, который он не может найти. каждый spl_autoload_register call в основном добавляет новый автозагрузчик, поэтому в памяти может быть много автозагрузчиков. Суть этой истории автозагрузчик, который не может загрузить класс, ничего не делает, блок автозагрузки кода просто завершается без каких-либо действий, поэтому следующий автозагрузчик может взять на себя ответственность за загрузку класса. Единственное, что вам нужно реализовать, — это проверить в своем автозагрузчике, что он может обрабатывать загрузку текущего класса (проверки того, что файл существует до того, как потребуется, достаточно, хотя вы должны подумать о возможном вложении каталогов в случае пространств имен), и все должно работать гладко в будущее:

function my_autoloader($class) {
$path = sprintf('classes/%s.php', $class);
if (file_exists($path)) {
require 'classes/' . $class . '.php';
}
}
6

Другие решения

Если это для небольшого проекта, в который вы включаете файлы из двух или трех папок, вы можете использовать простой оператор if.

function my_autoloader($class) {
if(file_exists('functions/'.$class.'.php')){
require 'functions/'$class.'.php';
} else if(file_exists('vendor/'.$class.'.php')){
require 'vendor/'.$class.'.php';
} //add more as needed
}
spl_autoload_register('my_autoloader');

Для более крупных приложений я рекомендую называть ваши файлы классов и ваши классы тем, что они есть или делают, и размещать их в определенной папке по именам. Пример: controllers / userController.php для функций класса userController / generalFunctions.php Класс GeneralFunctions, тогда вы можете проверьте имена и, если у него есть контроллер, то вы включаете его из папок контроллеров. Создайте массив в функции my_autoloader или в отдельном файле, например.

loadMap.php

return [
'controller' => 'path/to/controllers/',
'function' => 'path/to/functions/',
'helper' => 'path/to/helpers',
'etc' => 'path/to/etc/'
]

filewithautoloadfunction.php

function my_autoloader($class){
$loadMap = require 'path/to/loadMap.php';

foreach($loadMap as $key => $path){
if(stripos($key, $class){
require_once $path.$class.'.php';
}
}
}

spl_autoload_register('my_autoloader');
4

После дальнейших исследований в связи с идеями, которые @Etki и @Sarah Wilson дали мне, я нашел следующее решение. Спасибо вам обоим за ваш вклад.

require 'vendor/autoload.php';
require 'functions/general.php';
require 'include/mailgun.php';function autoLoader ($class) {
if (file_exists(__DIR__.'/classes/'.$class.'.php')) {
require __DIR__.'/classes/'.$class.'.php';
}
}
spl_autoload_register('autoLoader');

Подсказка: я добавил __DIR__ в начало пути к файлам внутри функции автозагрузки.

4
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector