Не подключается класс, автозагрузчиком
Есть структура:
Есть файл index.php со следующим кодом.
<?php
require 'autoload.php';
use Config;
$data = Config::getConfig();
echo $data;
?>
и есть автозагрузчик в котором реализовано простое условие, проверяющее, если мы подключаем класс Config то идти за ним по одному пути, если нет - по другому.
Вот его код:
<?php
spl_autoload_register(function ($class_name) {
echo $class_name;
if ($class_name == "Config"):
echo "con";
$configPath = $_SERVER['DOCUMENT_ROOT'] . '/config/' . $class_name . '.php';
$str = str_replace("\\", "/", $configPath);
else:
echo "no conf";
$corePath = $_SERVER['DOCUMENT_ROOT'] . '/Core/' . $class_name . '/' . $class_name . '.php';
$str = str_replace("\\", "/", $corePath);
endif;
echo $str;
require_once($str);
});
В условие я захожу правильно. Получаю ошибку о том что он не может найти класс. В чем может быть проблема?
Также буду благодарен если кто-то подскажет толковую проверку на подключаемый класс, то что у меня - мне кажется костылем.
Если в браузере перейти по тому пути который в итоге лежит в переменной $str;, для конфига - файл есть.
Ответы (1 шт):
В блоке use вы сейчас подключаете не имя класса, а пространство имен:
use Config;
Чтобы теперь достучаться до класса, нужно это пространство имен указать перед классом:
$data = Config\Config::getConfig();
Чтобы подключить именно имя класса, нужно написать так:
use Config\Config;
...
$data = Config::getConfig();
Первый случай бывает полезен, когда у вас большая вложенность, например, есть пространство имен и в нем несколько классов:
namespace app\core\something;
Class class1 {}
Class class2 {}
И вы можете там, где нужно, подключить нужную вложенность:
use app\core\something;
И использовать так:
$a = new something\class1();
$b = new something\class2();
Теперь по spl_autoload_register. В $class_name вам должно прилетать именно имя класса + пространство имен. Поэтому вы можете переписать вашу функцию как-то так:
<?php
spl_autoload_register(function ($class_name) {
echo $class_name; // здесь увидите то, что должно быть: Config\Config
$sep = DIRECTORY_SEPARATOR;
// отделим пространство имен от имени класса:
if($lastNsPos = strrpos($class_name, '\\')){
$namespace = substr($class_name, 0, $lastNsPos);
$className = substr($class_name, $lastNsPos + 1);
}
if ($className == "Config"):
echo "con";
$configPath = $_SERVER['DOCUMENT_ROOT'] . $sep . 'config' . $sep . $className . '.php';
$str = str_replace("\\", "/", $configPath);
else:
echo "no conf";
$corePath = $_SERVER['DOCUMENT_ROOT'] . '/Core/' . $class_name . '/' . $class_name . '.php';
$str = str_replace("\\", "/", $corePath);
endif;
echo '<br >' . $str;
require_once($str);
});


