При обновлении до 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, но если есть что-то, что вы все еще хотите знать, я с радостью опубликую его здесь
@ArtisticPhoenix сбросил все классы в конкретном каталоге проекта, а также все классы в общем каталоге проекта.
После var_dumping $ routes ... это отобразило все классы в каталоге конкретного проекта, а также все классы в общем каталоге проекта.
пока отображается $ this-> routes << string (12) "public / index" >>
и метод $ this-> отображается <<< string (3) "GET" >>>
Если вам нужен лучший способ вывода материала, вы можете использовать мой класс Debug, вы можете найти его на моей странице GitHub. Он имеет защиту от рекурсии (чего не хватает var_export и друзьям), настройку ограничения глубины (для глубины вложенности), вы можете выводить только некоторые вещи из объекта, например константы, или защищенные свойства (даже частные свойства), и если этого было недостаточно он также выведет номер строки и файла, для которых был вызван метод debug::dump (чтобы вы могли найти отладочные вызовы после того, как они больше не нужны), он выводит аналогично var_dump
Да, и он находится в композиторе под evo/debug, он даже создает набор вызовов функций, которые обертывают класс, поэтому вы можете выполнить отладку, просто вызвав функцию типа debug_dump($var) вместо Debug::getInstand()->dump($var), которую вы должны настроить, хотя (все это задокументировано на Git), это довольно мило, и я даже не буду взимать с вас плату (все равно это бесплатно ... lol)
как установить $routes[$this->route][$this->method]['controller'] и $routes[$this->route][$this->method]['action']; и создать объект $controller
Я подозреваю, что вас зацепило это изменение в способе анализа выражений переменных: php.net/manual/en/….
@veshraj Джош Я никогда не включаю его сюда ради всего святого. Также я постоянно отправляю сообщение Кевину, дергающему его, с просьбой внести исправления, но все безрезультатно, так как он не ответил на это сейчас.
@adam Cameron. Я пробовал, но до сих пор безрезультатно, возможно, я делаю это неправильно
Несомненно, что у вас $routes[$this->route][$this->method]['controller'] и $routes[$this->route][$this->method]['action']; не установлены. Сначала попробуйте выяснить, почему он не установлен
Могу ли я дать аналогичную демонстрацию, чтобы начать работу
@VeshrajJoshi Вы можете, и мы будем очень признательны, если сможете






Перед вызовом $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 .....)) он не отображает ничего
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-адреса с классом вместе с функциями. Я делаю структуру папок, как показано ниже -

теперь посмотрим на код 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 очков). Если вы считаете, что мой ответ правильный и полезный для вас, пожалуйста, примите его после награждения .. Спасибо
Прошу прощения, потому что я не знаю значения щедрости
О, все в порядке, не беспокойся. Это полезно для вас?
Возникает очевидный вопрос: каково значение этих трех переменных:
$routes,$this->routeи$this->method, на них влияетvar_dump, и это должно стать очевидным. Затем проверьте, существуют ли они в$routes, это просто предположение без этой информации.