Здравствуйте уважаемые Гуру! Написал для личных нужд класс для проверки входящих данны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: 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 = ''; } } } } Спойлер: Код автора без форматирования 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 = ''; } } } }
[$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...
Ссылка должна быть обозначена в аргументах функции, а не при её вызове: PHP: // good function foo(&$bar) {} foo($bar); //bad function foo($bar) {} foo(&$bar);
Если речь идет о пользовательской функции - 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 В какую сторону думать, читать? Спасибо.
@arbit ты не поверишь... именно начиная с пхп5.4 решено было избавиться от двойного амперсанда при передаче по ссылке в функции. Ты тестируешь старый код - он работает. Переносишь на новую псевдоновую платформу - не работает. Псевдоновую потому что пару дней назад умер пхп5.5. Что уж говорить про пхп5.4? Пиши код под пхп7.0. Там уже 7.1 на подходе.
Всем спасибо вопрос решен Притупил я, однако... убрал амперсанд в третьем параметре и все заработало,