PHP spl_autoload_register не работает

271
12 марта 2017, 07:52

Добрый день. Ради самообучения решил написать свой фреймворк, столкнулся со следующей проблемой

Есть такая конструкция

$route = new Route();
    $currentController = $route->getCurrentRoute();
    spl_autoload_register(function () use ($currentController) {
        $controllerFileName = __DIR__ . '/../App/Controllers/' . $currentController['controller'].'Controller' . '.php';
        if(file_exists($controllerFileName)) {
            include $controllerFileName;
        }
    });
    $controllerName = $currentController['controller'].'Controller';
    $controller = new $controllerName;

обращаюсь в браузере на корень сайта. Должен запустится DefaultController. Однако в ответ ошибка:

Class 'DefaultController' not found in Core.php(23): Core\Core->activeController()

код самого контроллера

    <?php
namespace App\Controllers;
use \Core\View;
use \Core\Controller;
/**
 * Class Default
 * @package App\Controllers
 */
class DefaultController extends Controller
{
    public function indexAction()
    {
        View::renderTemplate('Home/index.html');
    }
}

Что я делаю не так?

Answer 1

При инстанциации объекта из строки, строка должна содержать полный namespace класса:

 $ctrl = 'Default';
 $controllerName= "App\\Controllers\\{$ctrl}Controller";
 $controller = new $controllerName;
Answer 2

По всей видимости у вас не правильно ищется путь к файлу, проверьте что внутри переменной $controllerFileName:

$controllerFileName = __DIR__ . '/../App/Controllers/' . $currentController['controller'].'Controller' . '.php';
Answer 3

Добрый день. Попробуйте сделать проще. Определите по дефолту путь к вашим файлам. И будет что-то вроде:

spl_autoload_register(function($class) {
$path = "Classes";
if(strpos($class, "Controller") > 0) {
    $path = "Controllers";
} else if (strpos($class,"Model") > 0) {
    $path = "Models";
}
$classFile = "../$path/$class.php";
file_exists($classFile) ? require_once ("../$path/$class.php") : die("Class not found!");   
});

Надеюсь поможет=)

READ ALSO
access denied for user &#39;&#39;@&#39;localhost&#39; (using password: no)

access denied for user ''@'localhost' (using password: no)

Всем приветПомогите пожалуйста решить проблему

210
Когда удаляется static переменная в php?

Когда удаляется static переменная в php?

Ранее объект для работы с БД создавался как глобальная переменная сразу в начале выполнения скриптаПотом я переписал это в следующий вид

207
матрица расстояний

матрица расстояний

Есть таблица "Расстояние" с 3 столбцами:

511
php.ini - настройки почты Яндекс

php.ini - настройки почты Яндекс

Пробую отправлять почту через Яндекс из PHP:

302