Здравствуйте!
Пишу учебный проект.
Взялся за автозагрузку классов.
Задачи
загружать классы из карты классов там прописаны все классы которые входят в ядро приложения
Загружать классы отдельных модулей и сторонних библиотек по namespace из разрешённых директорий.
Класс вполне себе работает, но хочется узнать мнение опытных людей. Что я пропустил и какие ошибки допустил?
Вот мой класс:
class Autoloader extends SC
{
private static $instance = null;
/**
* @var array|string[]
*/
private $systemClasses;
/**
* Autoloader constructor.
*/
private function __construct()
{
$this->systemClasses = self::mapSystemClasses();
spl_autoload_register([$this, 'load'], true, false);
}
/**
* @return Autoloader|null
*/
public static function getInstance()
{
if (!isset(self::$instance)) {
self::$instance = new self();
}
return self::$instance;
}
/**
* @param $class
* Подключает найденный класс
*/
private function load($class)
{
require_once $this->getClass($class);
}
/**
* @param $class
* @return mixed|string
* Возвращает полное имя файла с классом
*/
private function getClass($class)
{
$namespace = explode('\\', $class);
$path = isset($namespace[1]) ? $this->otherClasses($class) : $this->systemClasses($class);
if (is_readable($path)) {
return $path;
} else {
exit('Нет файла с классом: ' . $class);
}
}
/**
* @param $class
* @return mixed|string
* Находит класс в карте и возвращает его имя файла
*/
private function systemClasses($class)
{
if (isset($this->systemClasses[$class])) {
return $this->systemClasses[$class];
} else {
exit('Класс ' . $class . ' не зарегистрирован');
}
}
/**
* @param $class
* @return string
* Ищет файл с запрошенным классом в разрешённых директорях public, vendor, test
* по namespase и возвращает полное имя файла
*/
private function otherClasses($class)
{
foreach ($this->folderClasses() as $dir) {
$file = './' . $dir . '/' . str_replace('\\', '/', $class) . '.php';
if (is_file($file)) {
$path = $file;
}
}
return $path;
}
}