Получение неопределенной ошибки индекса и имя метода должно быть строкой в ​​..error в PHP

При обновлении до PHP7 я столкнулся с этими проблемами.

Проблема в том, что я пытаюсь создать коды, которые я могу повторно использовать, например, мини-фреймворк и функцию RUN, где проблема используется для загрузки соответствующего шаблона и предоставления переменных. Он жалуется на

undefined index

из этих двух переменных

$controller = $routes[$this->route][$this->method]['controller'];
$action = $routes[$this->route][$this->method]['action'];

и он также жаловался на эту строку

$page = $controller->$action(); 

который отображал

Fatal error: Uncaught Error: Method name must be a string in...

public function run() {

            $routes = $this->routes->getRoutes();   

            $authentication = $this->routes->getAuthentication();

            if (isset($routes[$this->route]['login']) && !$authentication->isLoggedIn()) {
                header('location: /login/error');
            }
            else if (isset($routes[$this->route]['permissions']) && !$this->routes->checkPermission($routes[$this->route]['permissions'])) {
                header('location: /login/permissionserror');    
            }
            else {
                            $controller = $routes[$this->route][$this->method]['controller'];
                            $action = $routes[$this->route][$this->method]['action']; 
                            $page = $controller->$action();
                $title = $page['title'];

                if (isset($page['variables'])) {
                    $output = $this->loadTemplate($page['template'], $page['variables']);
                }
                else {
                    $output = $this->loadTemplate($page['template']);
                }

                echo $this->loadTemplate('layout.html.php', ['loggedIn' => $authentication->isLoggedIn(),
                                                             'output' => $output,
                                                             'title' => $title
                                                            ]);

            }

Это index.php

try {
    include __DIR__ . '/../includes/autoload.php';

    $route = ltrim(strtok($_SERVER['REQUEST_URI'], '?'), '/');

    $entryPoint = new \Ninja\EntryPoint($route, $_SERVER['REQUEST_METHOD'], new \Ijdb\IjdbRoutes());
    $entryPoint->run();
}
catch (PDOException $e) {
    $title = 'An error has occurred';

    $output = 'Database error: ' . $e->getMessage() . ' in ' .
    $e->getFile() . ':' . $e->getLine();

    include  __DIR__ . '/../templates/layout.html.php';
}

Код много, поэтому я не могу отобразить здесь весь код, так как использую шаблон MVC, но если есть что-то, что вы все еще хотите знать, я с радостью опубликую его здесь

Возникает очевидный вопрос: каково значение этих трех переменных: $routes, $this->route и $this->method, на них влияет var_dump, и это должно стать очевидным. Затем проверьте, существуют ли они в $routes, это просто предположение без этой информации.

ArtisticPhoenix 02.09.2018 02:27

@ArtisticPhoenix сбросил все классы в конкретном каталоге проекта, а также все классы в общем каталоге проекта.

user9749463 02.09.2018 02:57

После var_dumping $ routes ... это отобразило все классы в каталоге конкретного проекта, а также все классы в общем каталоге проекта.

user9749463 02.09.2018 03:12

пока отображается $ this-> routes << string (12) "public / index" >>

user9749463 02.09.2018 03:14

и метод $ this-> отображается <<< string (3) "GET" >>>

user9749463 02.09.2018 03:15

Если вам нужен лучший способ вывода материала, вы можете использовать мой класс Debug, вы можете найти его на моей странице GitHub. Он имеет защиту от рекурсии (чего не хватает var_export и друзьям), настройку ограничения глубины (для глубины вложенности), вы можете выводить только некоторые вещи из объекта, например константы, или защищенные свойства (даже частные свойства), и если этого было недостаточно он также выведет номер строки и файла, для которых был вызван метод debug::dump (чтобы вы могли найти отладочные вызовы после того, как они больше не нужны), он выводит аналогично var_dump

ArtisticPhoenix 02.09.2018 03:35

Да, и он находится в композиторе под evo/debug, он даже создает набор вызовов функций, которые обертывают класс, поэтому вы можете выполнить отладку, просто вызвав функцию типа debug_dump($var) вместо Debug::getInstand()->dump($var), которую вы должны настроить, хотя (все это задокументировано на Git), это довольно мило, и я даже не буду взимать с вас плату (все равно это бесплатно ... lol)

ArtisticPhoenix 02.09.2018 03:37

как установить $routes[$this->route][$this->method]['controller'] и $routes[$this->route][$this->method]['action']; и создать объект $controller

Veshraj Joshi 02.09.2018 03:52

Я подозреваю, что вас зацепило это изменение в способе анализа выражений переменных: php.net/manual/en/….

Adam Cameron 02.09.2018 10:31

@veshraj Джош Я никогда не включаю его сюда ради всего святого. Также я постоянно отправляю сообщение Кевину, дергающему его, с просьбой внести исправления, но все безрезультатно, так как он не ответил на это сейчас.

user9749463 03.09.2018 10:57

@adam Cameron. Я пробовал, но до сих пор безрезультатно, возможно, я делаю это неправильно

user9749463 03.09.2018 10:59

Несомненно, что у вас $routes[$this->route][$this->method]['controller'] и $routes[$this->route][$this->method]['action']; не установлены. Сначала попробуйте выяснить, почему он не установлен

Veshraj Joshi 03.09.2018 11:23

Могу ли я дать аналогичную демонстрацию, чтобы начать работу

Veshraj Joshi 03.09.2018 11:26

@VeshrajJoshi Вы можете, и мы будем очень признательны, если сможете

user9749463 04.09.2018 18:18
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
14
192
2

Ответы 2

Перед вызовом $page = $controller->$action(); проверьте, существуют ли controller и action:

if (isset($routes[$this->route][$this->method]['controller']) 
    && isset($routes[$this->route][$this->method]['action'])) {
    $controller = $routes[$this->route][$this->method]['controller'];
    $action = $routes[$this->route][$this->method]['action'];
    $page = $controller->$action();
    // ...
} else {
   // return 404 Page not found
}

после помещения всех кодов в if (isset .....)) он не отображает ничего

user9749463 02.09.2018 03:04

This code is runnable in php 7.2.7 (MAMP and LAMP), your way of dynamic function calling is invalid and your two variables are empty. This is not exact as yours but you can take logic form this demo.

Хорошо, я просто предоставляю очень простой пример отражения с сопоставлением URL-адреса с классом вместе с функциями. Я делаю структуру папок, как показано ниже - folder structure of the image

  1. Здесь .htaccess используется для перенаправления всех URL-адресов на index.php (если файл не существует).
  2. index.php включает весь код, который может инициализировать код (пока там было только три файла - uri.php, urlMapping.php и actions.php)
  3. URI.php - иметь функцию, которая предоставляет такие значения, как basepath, baseurl, uri
  4. urlMappig.php - это позволяет указать, какой URL-адрес попал в какой класс вместе с методом
  5. actions.php вызовет динамический класс и функцию (отражение)

теперь посмотрим на код index.php

    <?php
        include_once('URI.php');
        include_once('urlMapping.php');
        include_once('actions.php');

    ?>

Теперь кодируйте файл uri.php -

<?php
   // all function should be accessible to all file loaded now
   // return full url
    function full_url (){ 
        return (isset($_SERVER['HTTPS']) ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
    }
    // returns current directory
    function directory() {
        $parts = explode("/", __DIR__);
        return $parts[count($parts)-1];
    }
    // return base url
    function base_url(){ 
        $dir = directory();
        return  substr(full_url(), 0, strpos(full_url(), $dir)+strlen($dir));
    }
    // return uri
    function uri() { 
        return substr(full_url(), strlen(base_url())+1);
    }
?>

Теперь код в urlMapping.php

Note - file name and name of the class must be same as you map url in this file so that you can make call to dynamic classes and function on actions.php. If don't this will not work

<?php
    // this $urlMap will be accessed in actions.php
    $urlMap = [
        // here we use only uri so .. https://example.com/login hit LoginController class along with login function, this is just only the mapping
        'login' => ['class'=>'LoginController',
                    'function'=>'login'],
    ];
?>

Теперь код actions.php

<?php
    // if call is not like example.com/ means no uri is there
    if (uri()!='')
    {
        // if your uri exists in route collection or urlmapping collection then make call to your dynamic class and methods
        if (array_key_exists(uri(), $urlMap))
        {
            // include the class file dynamically from controllers folder
            include_once('controllers/'.$urlMap[uri()]['class'].'.php');
            // making references for dynamic class
            $controlerObject = new $urlMap[uri()]['class']();
            // call function dynaically from the referece
            $controlerObject->{$urlMap[uri()]['function']}();           

        }
        else
        {
            // you can make 404 page not
            echo 'No routing found';
        }
    }
    // call for home page 
    else
    {
        include_once('index.html.php');
    }
?>

Теперь класс controllres / LoginController.php,

Note - As mentioned above file name and name of the class as in urlMapping.php

<?php
    class LoginController{
        public function login()
        {
            // .... something your code goes here

            echo 'hello from the login function of login controller';
        }
        //...... other function you can define
    }
?>

Не могли бы вы задать свой вопрос в награду ... предоставляя гораздо больше очков (более 100 очков, вы можете получить 200 или даже 500 очков). Если вы считаете, что мой ответ правильный и полезный для вас, пожалуйста, примите его после награждения .. Спасибо

Veshraj Joshi 05.09.2018 07:48

Прошу прощения, потому что я не знаю значения щедрости

user9749463 05.09.2018 19:20

О, все в порядке, не беспокойся. Это полезно для вас?

Veshraj Joshi 05.09.2018 21:57

Другие вопросы по теме