За последние 24 часа нас посетили 16473 программиста и 1677 роботов. Сейчас ищут 855 программистов ...

Синтаксис array_walk_recursive внутри класса

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

  1. arbit

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

    С нами с:
    20 июл 2012
    Сообщения:
    13
    Симпатии:
    0
    Здравствуйте уважаемые Гуру!

    Написал для личных нужд класс для проверки входящих данныx (объекты, многомерные массивы строки)
    В нем используется функция array_walk_recursive()

    Если эта функция не в классе, то все работает
    Если в классе, то вылетает ошибка при вызове этой функции

    Warning: array_walk_recursive() expects parameter 2 to be a valid callback, function '_recursion' not found or invalid function name in Y:\home\localhost\www\soft\system\libraries\CSafety.php on line 50

    Класс подключен - require_once "./system/libraries/CSafety.php";
    Как в данном случае правильно синтаксически указать второй параметр в этой функции?

    Если через $this, то нужно делать сам вызов пользовательской функции.
    А в справочниках указывается именно имя функции

    Где зарыта собака?
    array_walk_recursive($val, '_recursion', &$hacklog)

    Заранее всем благодарен за участие

    Код

    PHP:
    1. class CSafety
    2. {
    3. function hack($val)
    4.         {
    5.         //Массив результатов проверки
    6.         $hacklog =array();
    7.         //Если объект - переводим в ассоциативный массив
    8.         if(is_object($val)) $val = get_object_vars($val);
    9.         //Если массив
    10.         if(is_array($val)){array_walk_recursive($val,  '_recursion', &$hacklog);}    
    11.         //Если не число. Переменная $z - как заглушка, если $val не массив
    12.         else{if(!is_numeric($val)){$this->_recursion($val, $z, $hacklog);}}
    13.         return    $hacklog;
    14.         }
    15. //=======================================================
    16.      function _recursion(&$val, $key, &$hacklog)
    17.         {
    18.         if(!is_numeric($val))
    19.             {
    20.             $item = trim($val);
    21.             $tamplate = "/script|eval|preg_replace|require_once|include_once|include|require|create_function|readfile|dir|fopen|etc|<|>|<|>|WHERE|FROM|LIKE|BETWEEN|SELECT|INSERT|DELETE|UPDATE|CREATE|UNION|ALTER TABLE|exe|exec|tmp/i";
    22.             if(preg_match($tamplate,$item))
    23.                 {
    24.                 //Заполняем масив результатами
    25.                 $hacklog['hack_date'] = date("y.m.d H:m:s");
    26.                 $hacklog['ip'] = $_SERVER['REMOTE_ADDR'];
    27.                 $hacklog['hack_data'] = $val;
    28.                 $val = '';
    29.                 }
    30.             }
    31.         }
    32. }
    class CSafety
    {
    function hack($val)
    {
    //Массив результатов проверки
    $hacklog =array();
    //Если объект - переводим в ассоциативный массив
    if(is_object($val)) $val = get_object_vars($val);
    //Если массив
    if(is_array($val)){array_walk_recursive($val, '_recursion', &$hacklog);}
    //Если не число. Переменная $z - как заглушка, если $val не массив
    else{if(!is_numeric($val)){$this->_recursion($val, $z, $hacklog);}}
    return $hacklog;
    }
    //=======================================================
    function _recursion(&$val, $key, &$hacklog)
    {
    if(!is_numeric($val))
    {
    $item = trim($val);
    $tamplate = "/script|eval|preg_replace|require_once|include_once|include|require|create_function|readfile|dir|fopen|etc|<|>|<|>|WHERE|FROM|LIKE|BETWEEN|SELECT|INSERT|DELETE|UPDATE|CREATE|UNION|ALTER TABLE|exe|exec|tmp/i";
    if(preg_match($tamplate,$item))
    {
    //Заполняем масив результатами
    $hacklog['hack_date'] = date("y.m.d H:m:s");
    $hacklog['ip'] = $_SERVER['REMOTE_ADDR'];
    $hacklog['hack_data'] = $val;
    $val = '';
    }
    }
    }
    }
     
    #1 arbit, 12 июл 2016
    Последнее редактирование модератором: 13 июл 2016
  2. Schrodinger

    Schrodinger Новичок

    С нами с:
    8 июн 2016
    Сообщения:
    40
    Симпатии:
    5
    Код (Text):
    1. array_walk_recursive($val, [$this,'_recursion'], $hacklog)
     
  3. arbit

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

    С нами с:
    20 июл 2012
    Сообщения:
    13
    Симпатии:
    0
    [$this,'_recursion'] - на это тоже ругается
    Fatal error: Call-time pass-by-reference has been removed in /home/medped00/arbitstudio.com/soft/system/libraries/CSafety.php on line 50

    или я чего-то не понял из ответа Schrodinger...
     
  4. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    Ссылка должна быть обозначена в аргументах функции, а не при её вызове:
    PHP:
    1. // good
    2. function foo(&$bar) {}
    3. foo($bar);
    4.  
    5. //bad
    6. function foo($bar) {}
    7. foo(&$bar);
     
  5. arbit

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

    С нами с:
    20 июл 2012
    Сообщения:
    13
    Симпатии:
    0
    Если речь идет о пользовательской функции - function _recursion(&$val,$key,&$hacklog),
    то у меня вроде все нормально.
    Дело в другом, нужно вызывать ее не как функцию, а как метод класса в котором она находится.
    почитал здесь https://php.ru/manual/language.types.callable.html и переписал

    array_walk_recursive($val, array('CSafety', '_recursion'), &$hacklog);

    Теперь на локальном сервере под денвером (PHP Version 5.3.29) - все работает нормально,
    а на реальном хостинге (PHP Version 5.4) - дает ошибку:

    Fatal error: Call-time pass-by-reference has been removed in /home/xxx.com/soft/system/libraries/CSafety.php on line 50

    Хотя функция по описанию должна работать и на php7

    В какую сторону думать, читать?

    Спасибо.
     
  6. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    @arbit ты не поверишь... именно начиная с пхп5.4 решено было избавиться от двойного амперсанда при передаче по ссылке в функции. Ты тестируешь старый код - он работает. Переносишь на новую псевдоновую платформу - не работает. Псевдоновую потому что пару дней назад умер пхп5.5. Что уж говорить про пхп5.4? Пиши код под пхп7.0. Там уже 7.1 на подходе.
     
  7. arbit

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

    С нами с:
    20 июл 2012
    Сообщения:
    13
    Симпатии:
    0
    Всем спасибо вопрос решен
    Притупил я, однако...
    убрал амперсанд в третьем параметре и все заработало,