Вызов динамического пространства имен в PHP - PullRequest
0 голосов
/ 02 июля 2019

Я впервые использую PHP ООП и Пространство имен.Я пытался загрузить класс динамически, но всегда получал ошибку.Fatal error: Uncaught Error: Call to undefined function App\Controllers\DefaultController() in C:\xampp\htdocs\test\app\Core\Router.php:20

Я загружаю и ставлю пространство имен (PSR-4) с помощью Composer.Я хочу создать свой собственный MVC, прежде чем переходить к фреймворку.

test\app\Core\Router.php

<?php

namespace App\Core;

use App\Controllers\ErrorController;

class Router
{
    protected $controller;
    protected $action;
    protected $params = [];

    public function __construct()
    {
        $this->parseURL();

        if(file_exists(APP_CTRL . $this->controller . ".php"))
        {
           //this is the problem.. the ErrorController() below works fine...
            $class = "App\Controllers\\" . $this->controller;
            $class();
        }
        else
        {
            $error = new ErrorController();
            $error->error_404();
        }
    }

    protected function parseURL()
    {
        $request = trim($_SERVER['REQUEST_URI'], '/');

        if(!empty($request))
        {
            $url = explode('/', $request);

            $this->controller = isset($url[0]) ? ucfirst($url[0]) . 'Controller' : 'DefaultController';
            $this->action = isset($url[1]) ? $url[1] : 'index';
            unset($url[0], $url[1]);
            $this->params = !empty($url) ? $url : [];
        }
        else
        {
            $this->controller = 'DefaultController';
            $this->action = 'index';
        }
    }
}

Что касается моего контроллера.

test\app\Controllers\DefaultController.php

<?php

namespace App\Controllers;

class DefaultController extends Basecontroller
{
    public function index()
    {
        echo 'Hi from Default';
    }
}

Попробовал с помощью этого Вызов класса в пространстве имен по переменной в PHP , но он не работает

Уже проверено это: https://coderwall.com/p/kiz5nq/instantiating-a-namespaced-php-class-dynamically и https://www.designcise.com/web/tutorial/how-to-dynamically-invoke-a-class-method-in-php

1 Ответ

1 голос
/ 02 июля 2019

В строках ...

$class = "App\Controllers\\" . $this->controller;
$class();

Вторая строка просто пытается вызвать функцию с именем вашего класса.Вместо этого вам нужно создать новый экземпляр класса ..

$controller = new $class();

Затем вы можете вызывать любой метод в классе как обычно ...

$controller->index();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...