PHP: Текущая версия PHP: 7.0.8 Notice: Array to string conversion in C:\xampp\htdocs\engine\core\Router.php on line 76 Notice: Undefined property: RenderTemplate::$Array in C:\xampp\htdocs\engine\core\Router.php on line 76 Fatal error: Uncaught Error: Function name must be a string in C:\xampp\htdocs\engine\core\Router.php:76 Stack trace: #0 C:\xampp\htdocs\index.php(16): Router::dispatch() #1 {main} thrown in C:\xampp\htdocs\engine\core\Router.php on line 76 PHP: public static function dispatch() { $uri = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH); $method = $_SERVER['REQUEST_METHOD']; $searches = array_keys(static::$patterns); $replaces = array_values(static::$patterns); $found_route = false; // check if route is defined without regex if (in_array($uri, self::$routes)) { $route_pos = array_keys(self::$routes, $uri); foreach ($route_pos as $route) { if (self::$methods[$route] == $method) { $found_route = true; //if route is not an object if (!is_object(self::$callbacks[$route])) { //grab all parts based on a / separator $parts = explode('/', self::$callbacks[$route]); //collect the last index of the array $last = end($parts); //grab the controller name and method call $segments = explode('@', $last); //instanitate controller $controller = new $segments[0](); //call method $controller->$segments[1]();//76 if (self::$halts) { return; } } else { //call closure call_user_func(self::$callbacks[$route]); if (self::$halts) { return; } } } } } else { ... }
Привет, джони. Я тут вижу 44 строки. А ругается на 76. Я даже своим опытом поискал вхождение класса "RenderTemplate". Но не нашел ибо нет такого в коде. Только в ошибке. Чем тебе помочь? Научить копипастить?
Вот весь код. PHP: <?php /** * @method static Macaw get(string $route, Callable $callback) * @method static Macaw post(string $route, Callable $callback) * @method static Macaw put(string $route, Callable $callback) * @method static Macaw delete(string $route, Callable $callback) * @method static Macaw options(string $route, Callable $callback) * @method static Macaw head(string $route, Callable $callback) */ class Router { public static $halts = false; public static $routes = array(); public static $methods = array(); public static $callbacks = array(); public static $patterns = array( ':any' => '[^/]+', ':num' => '[0-9]+', ':all' => '.*' ); public static $error_callback; /** * Defines a route w/ callback and method */ public static function __callstatic($method, $params) { $uri = $params[0]; $callback = $params[1]; array_push(self::$routes, $uri); array_push(self::$methods, strtoupper($method)); array_push(self::$callbacks, $callback); } /** * Defines callback if route is not found */ public static function error($callback) { self::$error_callback = $callback; } public static function haltOnMatch($flag = true) { self::$halts = $flag; } /** * Runs the callback for the given request */ public static function dispatch() { $uri = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH); $method = $_SERVER['REQUEST_METHOD']; $searches = array_keys(static::$patterns); $replaces = array_values(static::$patterns); $found_route = false; // check if route is defined without regex if (in_array($uri, self::$routes)) { $route_pos = array_keys(self::$routes, $uri); foreach ($route_pos as $route) { if (self::$methods[$route] == $method) { $found_route = true; //if route is not an object if (!is_object(self::$callbacks[$route])) { //grab all parts based on a / separator $parts = explode('/', self::$callbacks[$route]); //collect the last index of the array $last = end($parts); //grab the controller name and method call $segments = explode('@', $last); //instanitate controller $controller = new $segments[0](); //call method $controller->$segments[1](); if (self::$halts) { return; } } else { //call closure call_user_func(self::$callbacks[$route]); if (self::$halts) { return; } } } } } else { // check if defined with regex $pos = 0; foreach (self::$routes as $route) { if (strpos($route, ':') !== false) { $route = str_replace($searches, $replaces, $route); } if (preg_match('#^' . $route . '$#', $uri, $matched)) { if (self::$methods[$pos] == $method) { $found_route = true; array_shift($matched); //remove $matched[0] as [1] is the first parameter. if (!is_object(self::$callbacks[$pos])) { //grab all parts based on a / separator $parts = explode('/', self::$callbacks[$pos]); //collect the last index of the array $last = end($parts); //grab the controller name and method call $segments = explode('@', $last); //instanitate controller $controller = new $segments[0](); //call method and pass any extra parameters to the method $controller->$segments[1](implode(",", $matched)); if (self::$halts) { return; } } else { call_user_func_array(self::$callbacks[$pos], $matched); if (self::$halts) { return; } } } } ++$pos; } } // run the error callback if the route was not found if ($found_route == false) { if (!self::$error_callback) { self::$error_callback = function () { header($_SERVER['SERVER_PROTOCOL'] . " 404 Not Found"); include 'engine/template/404.php'; }; } call_user_func(self::$error_callback); } } };
Ругается на "RenderTemplate" из-за index.php PHP: <?php echo 'Текущая версия PHP: ' . phpversion(); session_start(); require_once "engine/autoloader.php"; Router::get('/', 'RenderTemplate@home'); ... Router::get('/play/', 'RenderTemplate@play'); Router::dispatch();
Ругается не на рендертемплейт а на отсутствие в нем статического свойства Эррей. А Эррей он ищет, потому что шагом до этого он попытался обратиться к строковому значению, но встретил массив. По правилу каста в строку, массив быстро превращается в строку Array. То есть, тебе надо смотреть на значение, из которого ты ожидаешь строку, но там на самом деле массив.
Кстати, да,нашел такой код: PHP: View::render('home', array ( 'pageTitle' => 'Главная Name Role Play', 'allusers' => $allusers, 'bus' => $bus, 'dal' => $dal, 'taxi' => $taxi, 'meh' => $meh, 'tov' => $tov, 'mus' => $mus )); В PHP Wiki я не нашел такого способа...