Задать вопрос
sp1se
@sp1se
IT manager

Почему невозможно создать экземпляр класса в route.php?

Добрый день.
Учусь писать router php.
Просьба воздержаться от советов изучения framework-ом или готовых route-ов, я этим уже занимаюсь) но я лучше всего понимаю когда сам пишу.
У меня есть Index.php c кодом
<?php

require_once __DIR__.'/vendor/autoload.php';

use Controllers\User as User;
use Controllers\Route as Route;
use Controllers\Magic as Magic;

$route = new Route();
$route->run();

я использую composer и autoload работает.
В Router у меня следующее:
namespace Controllers;

Class Route
{
    public $_class;
    public $_method;


    public function __construct()
    {
        $request = $_SERVER['REQUEST_URI'];
        $uri = explode('/',$request);

        if(isset($uri['1'])){
            $this->_class = $uri['1'];
        }
        if(isset($uri['2'])){
            $this->_method = $uri['2'];
        }
    }

    public function run()
    {
        //Magic::pr(get_declared_classes());

        $name = $this->_class;

        $class = new $name();

        if(class_exists(__NAMESPACE__."/".$this->_class)){
            Magic::pr($this->_class);
        }else{
            echo $this->_class."Class Not exists!";
        }


Так же есть тестовый класс User который говорит привет)
Проблема в том когда я делаю запрос на адрес localhost/User тоесть передаю в $uri['1'] = User и хочу потом создать экземпляр класса, то получаю ошибку о несуществовании такого класса.
Испробовал уже все что смог. добавлял __NAMESPACE__, пробовал вызывать в Index.php ничего.
если просто прописать в index.php $a = new User(): все работает.
Подскажите куда копать?
  • Вопрос задан
  • 329 просмотров
Подписаться 1 Оценить Комментировать
Решения вопроса 1
rdifb0
@rdifb0
Программист, реалист
У вас слеш не в ту сторону, там где вы добавляете NAMESPACE.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
nazarpc
@nazarpc
Open Source enthusiast
Значит не то добавляли.
Вообще напрямую использовать данные из ввода пользователя как название класса идея не очень здоровая.
Тогда можно так:
if ($uri[1] === 'User') {
    $User = new User();
}

А ещё:
use Controllers\User;
use Controllers\Route;
use Controllers\Magic;

Если после as вы пишете название класса без изменения - в этом нет никакого смысла.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы