@awalarone

Почему class_exists() выдает flase при проверке наличия класса если класс есть?

Люди добрые, помогите пожалуйста.
Суть такая, пишу роутер (Новичок), и не могу проверить наличие класса...
Подскажите что не так? spl_autoload_register() Есть и исправно работает.

Вот мой роутер:
<?php
namespace inc\classes;

class Router
{
    private $routes = [];
    private $params = [];
    private $matches;

    public function __construct()
    {
        $arr = include "inc/routes.php";
        foreach ($arr as $key => $value) {
        	$this->addRoutes($key, $value);
        }
    }

    public function addRoutes($routs, $params)
    {
    	$routs = '#^'.$routs.'$#';
    	$this->routes[$routs] = $params;
    	$url = trim($_SERVER['REQUEST_URI'], '/');
    	foreach ($this->routes as $routs => $value)
	    {
	    	if (preg_match($routs, $url, $matches))
		    {
		        $this->params = $this->routes[$routs];
				$this->matches = $matches;
		    }
	    }
    }

    public function runRouter()
    {
    	if ($this->matches)
	    {
	    	$path = 'inc/classes/'.ucfirst($this->params['controller']);
	    	var_dump(class_exists($path, false));
	    	if (class_exists($path.'::class'))
		    {
		    	echo 'ok';
		    }
	    }
    }
}
  • Вопрос задан
  • 90 просмотров
Решения вопроса 1
php666
@php666
PHP-макака
$arr = include "inc/routes.php";
в методах не должно быть никаких include, никогда. передай значение явно, как угодно:
$arr = include "inc/routes.php";
$router = new Router($arr);
// или 
$router->setRoutes($arr);


$routs = '#^'.$routs.'$#';
почему это здесь? описание роута должно быть уже законченным в твоем файле роутов "inc/routes.php", класс ничего не должен добавлять к регулярному выражению.

spl_autoload_register() Есть и исправно работает.

$path = 'inc/classes/'.ucfirst($this->params['controller']);

Это говнокод все. Никаких директорий inc, никаких classes. Все должно быть оопшно и красиво, никаких require.
Начинай сразу делать правильно.
Берешь эту статью и пытаешься сделать автозагрузку стандарта PSR-4 до тех пор пор, пока у тебя не получится. Что бы все лежало в пространстве имён.

Тебе нужно скачать композер, для windows composer.phar, через консоль запустить создание своего composer.json, в статье той тебе НЕ нужно всё, что относится к " подразделы: classmap, files", придумаешь имя себе (vendorname) и имя пакета своего (myfirstgovnokod) далее, когда всё правильно сделаешь у тебя будет всё как правильно - автозагрузка, возможность устанавливать пакеты из вне и правильный подход.

Сделаешь - покажешь.

Вот пример что примерно должно получиться:

/composer.json
{
    "name": "vendorname/myfirstgovnokod",
    "require": {},
    "autoload": {
        "psr-4": {
            "Govnokod\\": "src"
        }
    }
}


/src/Test.php
<?php
namespace Govnokod;

class Test
{

}


/index.php
<?php

include 'vendor/autoload.php';

use Govnokod\Test;

$test = new Test();

print_r($test);
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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