powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / PHP Синтаксис рекурсивной внутри класса функции
6 сообщений из 6, страница 1 из 1
PHP Синтаксис рекурсивной внутри класса функции
    #39272741
Arbit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте уважаемые  Гуру!

Написал для личных нужд класс для проверки входящих данны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)

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

Код
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 = '';
                }
            }
        }
}
...
Рейтинг: 0 / 0
PHP Синтаксис рекурсивной внутри класса функции
    #39272791
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может документацию почитать? http://php.net/manual/ru/language.types.callable.php
...
Рейтинг: 0 / 0
PHP Синтаксис рекурсивной внутри класса функции
    #39273132
Arbit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BarloneМожет документацию почитать? http://php.net/manual/ru/language.types.callable.php

Спасибо за ссылку. Почитал, изменил синтаксис вызова
Было - array_walk_recursive($val, '_recursion', &$hacklog);

Стало - array_walk_recursive($val, array('CSafety', '_recursion'), &$hacklog);

здесь пользовательскую функцию вызываю как метод класса CSafety
private static function _recursion(&$val, $key, &$hacklog) {}

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

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

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

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

Спасибо.
...
Рейтинг: 0 / 0
PHP Синтаксис рекурсивной внутри класса функции
    #39273144
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arbit,

Проблема то не в функции, а в передаче параметров. "По ссылке" должно быть указано в определении самой функции, а не в вызове. Раньше можно было этот амперсанд ляпать в вызове, потом это выпилили.
...
Рейтинг: 0 / 0
PHP Синтаксис рекурсивной внутри класса функции
    #39273175
Arbit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vkleArbit,

Проблема то не в функции, а в передаче параметров. "По ссылке" должно быть указано в определении самой функции, а не в вызове. Раньше можно было этот амперсанд ляпать в вызове, потом это выпилили.

Спасибо большое, добрый человек!
Что-то я притупил :)

Все работает.
Вопрос закрыт.
...
Рейтинг: 0 / 0
PHP Синтаксис рекурсивной внутри класса функции
    #39273181
Arbit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо Barlone!
Спасибо vkle!
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / PHP Синтаксис рекурсивной внутри класса функции
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]