Не подключается класс, автозагрузчиком

Есть структура:

структура проекта

Есть файл 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);
});
→ Ссылка