За последние 24 часа нас посетили 58953 программиста и 1772 робота. Сейчас ищут 968 программистов ...

Array to string conversion

Тема в разделе "PHP для новичков", создана пользователем Johhny, 15 сен 2016.

  1. Johhny

    Johhny Активный пользователь

    С нами с:
    7 авг 2015
    Сообщения:
    34
    Симпатии:
    0
    PHP:
    1. Текущая версия PHP: 7.0.8
    2. Notice: Array to string conversion in C:\xampp\htdocs\engine\core\Router.php on line 76
    3.  
    4. Notice: Undefined property: RenderTemplate::$Array in C:\xampp\htdocs\engine\core\Router.php on line 76
    5.  
    6. 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:
    1.     public static function dispatch()
    2.     {
    3.         $uri = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
    4.         $method = $_SERVER['REQUEST_METHOD'];
    5.         $searches = array_keys(static::$patterns);
    6.         $replaces = array_values(static::$patterns);
    7.         $found_route = false;
    8.         // check if route is defined without regex
    9.         if (in_array($uri, self::$routes)) {
    10.             $route_pos = array_keys(self::$routes, $uri);
    11.             foreach ($route_pos as $route) {
    12.                 if (self::$methods[$route] == $method) {
    13.                     $found_route = true;
    14.                     //if route is not an object
    15.                     if (!is_object(self::$callbacks[$route])) {
    16.                         //grab all parts based on a / separator
    17.                         $parts = explode('/', self::$callbacks[$route]);
    18.                         //collect the last index of the array
    19.                         $last = end($parts);
    20.                         //grab the controller name and method call
    21.                         $segments = explode('@', $last);
    22.                         //instanitate controller
    23.                         $controller = new $segments[0]();
    24.                         //call method
    25.                         $controller->$segments[1]();//76
    26.  
    27.                         if (self::$halts) {
    28.                             return;
    29.                         }
    30.  
    31.                     } else {
    32.                         //call closure
    33.                         call_user_func(self::$callbacks[$route]);
    34.  
    35.                         if (self::$halts) {
    36.                             return;
    37.                         }
    38.  
    39.                     }
    40.                 }
    41.             }
    42.         } else {
    43.           ...
    44.   }
     
  2. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    Привет, джони. Я тут вижу 44 строки. А ругается на 76. Я даже своим опытом поискал вхождение класса "RenderTemplate". Но не нашел ибо нет такого в коде. Только в ошибке.

    Чем тебе помочь? Научить копипастить?
     
    denis01 нравится это.
  3. Johhny

    Johhny Активный пользователь

    С нами с:
    7 авг 2015
    Сообщения:
    34
    Симпатии:
    0
    Вот весь код.
    PHP:
    1. <?php
    2.  
    3. /**
    4. * @method static Macaw get(string $route, Callable $callback)
    5. * @method static Macaw post(string $route, Callable $callback)
    6. * @method static Macaw put(string $route, Callable $callback)
    7. * @method static Macaw delete(string $route, Callable $callback)
    8. * @method static Macaw options(string $route, Callable $callback)
    9. * @method static Macaw head(string $route, Callable $callback)
    10. */
    11. class Router
    12. {
    13.     public static $halts = false;
    14.     public static $routes = array();
    15.     public static $methods = array();
    16.     public static $callbacks = array();
    17.     public static $patterns = array(
    18.         ':any' => '[^/]+',
    19.         ':num' => '[0-9]+',
    20.         ':all' => '.*'
    21.     );
    22.     public static $error_callback;
    23.     /**
    24.      * Defines a route w/ callback and method
    25.      */
    26.     public static function __callstatic($method, $params)
    27.     {
    28.  
    29.         $uri = $params[0];
    30.         $callback = $params[1];
    31.         array_push(self::$routes, $uri);
    32.         array_push(self::$methods, strtoupper($method));
    33.         array_push(self::$callbacks, $callback);
    34.     }
    35.  
    36.     /**
    37.      * Defines callback if route is not found
    38.      */
    39.     public static function error($callback)
    40.     {
    41.         self::$error_callback = $callback;
    42.     }
    43.  
    44.     public static function haltOnMatch($flag = true)
    45.     {
    46.         self::$halts = $flag;
    47.     }
    48.  
    49.     /**
    50.      * Runs the callback for the given request
    51.      */
    52.     public static function dispatch()
    53.     {
    54.         $uri = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
    55.         $method = $_SERVER['REQUEST_METHOD'];
    56.         $searches = array_keys(static::$patterns);
    57.         $replaces = array_values(static::$patterns);
    58.         $found_route = false;
    59.         // check if route is defined without regex
    60.         if (in_array($uri, self::$routes)) {
    61.             $route_pos = array_keys(self::$routes, $uri);
    62.             foreach ($route_pos as $route) {
    63.                 if (self::$methods[$route] == $method) {
    64.                     $found_route = true;
    65.                     //if route is not an object
    66.                     if (!is_object(self::$callbacks[$route])) {
    67.                         //grab all parts based on a / separator
    68.                         $parts = explode('/', self::$callbacks[$route]);
    69.                         //collect the last index of the array
    70.                         $last = end($parts);
    71.                         //grab the controller name and method call
    72.                         $segments = explode('@', $last);
    73.                         //instanitate controller
    74.                         $controller = new $segments[0]();
    75.                         //call method
    76.                         $controller->$segments[1]();
    77.  
    78.                         if (self::$halts) {
    79.                             return;
    80.                         }
    81.  
    82.                     } else {
    83.                         //call closure
    84.                         call_user_func(self::$callbacks[$route]);
    85.  
    86.                         if (self::$halts) {
    87.                             return;
    88.                         }
    89.  
    90.                     }
    91.                 }
    92.             }
    93.         } else {
    94.             // check if defined with regex
    95.             $pos = 0;
    96.             foreach (self::$routes as $route) {
    97.                 if (strpos($route, ':') !== false) {
    98.                     $route = str_replace($searches, $replaces, $route);
    99.                 }
    100.                 if (preg_match('#^' . $route . '$#', $uri, $matched)) {
    101.                     if (self::$methods[$pos] == $method) {
    102.                         $found_route = true;
    103.                         array_shift($matched); //remove $matched[0] as [1] is the first parameter.
    104.                         if (!is_object(self::$callbacks[$pos])) {
    105.                             //grab all parts based on a / separator
    106.                             $parts = explode('/', self::$callbacks[$pos]);
    107.                             //collect the last index of the array
    108.                             $last = end($parts);
    109.                             //grab the controller name and method call
    110.                             $segments = explode('@', $last);
    111.                             //instanitate controller
    112.                             $controller = new $segments[0]();
    113.                             //call method and pass any extra parameters to the method
    114.                             $controller->$segments[1](implode(",", $matched));
    115.  
    116.                             if (self::$halts) {
    117.                                 return;
    118.                             }
    119.  
    120.                         } else {
    121.                             call_user_func_array(self::$callbacks[$pos], $matched);
    122.  
    123.                             if (self::$halts) {
    124.                                 return;
    125.                             }
    126.  
    127.                         }
    128.  
    129.                     }
    130.                 }
    131.                 ++$pos;
    132.             }
    133.         }
    134.  
    135.         // run the error callback if the route was not found
    136.         if ($found_route == false) {
    137.             if (!self::$error_callback) {
    138.                 self::$error_callback = function () {
    139.                     header($_SERVER['SERVER_PROTOCOL'] . " 404 Not Found");
    140.                     include 'engine/template/404.php';
    141.                 };
    142.             }
    143.             call_user_func(self::$error_callback);
    144.         }
    145.     }
    146. };
     
  4. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    А, вижу. Ты отметил для нас 76 строку.

    Отладку проводил? Что лежит в переменных? В ключах?
     
  5. Johhny

    Johhny Активный пользователь

    С нами с:
    7 авг 2015
    Сообщения:
    34
    Симпатии:
    0
    Ругается на "RenderTemplate" из-за index.php
    PHP:
    1. <?php
    2. echo 'Текущая версия PHP: ' . phpversion();
    3. require_once "engine/autoloader.php";
    4. Router::get('/', 'RenderTemplate@home');
    5. ...
    6. Router::get('/play/', 'RenderTemplate@play');
    7. Router::dispatch();
     
  6. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    Ругается не на рендертемплейт а на отсутствие в нем статического свойства Эррей. А Эррей он ищет, потому что шагом до этого он попытался обратиться к строковому значению, но встретил массив. По правилу каста в строку, массив быстро превращается в строку Array. То есть, тебе надо смотреть на значение, из которого ты ожидаешь строку, но там на самом деле массив.
     
  7. Johhny

    Johhny Активный пользователь

    С нами с:
    7 авг 2015
    Сообщения:
    34
    Симпатии:
    0
    Кстати, да,нашел такой код:
    PHP:
    1.         View::render('home', array (
    2.             'pageTitle' => 'Главная Name Role Play',
    3.             'allusers' => $allusers,
    4.             'bus' => $bus,
    5.             'dal' => $dal,
    6.             'taxi' => $taxi,
    7.             'meh' => $meh,
    8.             'tov' => $tov,
    9.             'mus' => $mus
    10.         ));
    В PHP Wiki я не нашел такого способа...