Функция обратного вызова PHP не работает с объектными функциями - PullRequest
4 голосов
/ 10 октября 2010

У меня есть массив, и я хочу применить MySQLi->real_escape_string к каждому члену массива через array_walk, но это не работает:

array_walk($array, '$mysqli->real_escape_string');

Выдает эту ошибку:

Предупреждение: array_walk () ожидает, что параметр 2 будет допустимым обратным вызовом, функция '$ mysqli-> real_escape_string' не найдена или недопустимое имя функции в C: \ wamp \ www \ ts.php в строке 69

$mysqli является допустимым объектом и отлично работает, если я сделаю $mysqli->real_escape_string('anything') для всего остального.

Мой вопрос: Разве невозможно передать функции объекта в качестве обратного вызова?Или я что-то не так делаю.


ВАЖНО: Я знаю, что могу создать свою собственную функцию обратного вызова и реализовать в ней $ mysqli-> real_escape_string НО IХотите знать, нельзя ли использовать обратный вызов в качестве функции объекта?

Ответы [ 3 ]

9 голосов
/ 10 октября 2010

Если вы вызываете метод внутри объекта, вы должны передать в массиве, первым элементом будет объект / контекст, а затем вторым должен быть метод:

Маленький пример

function callback()
{
   //blah
}

вышесказанное называется функцией и должно вызываться так: array_walk($array, 'callback');

class object()
{
    public function callback()
    {
    }
}

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

$object = new object();
array_walk($array, array($object , 'callback'));

MySQLi является объектно-ориентированной библиотекой, поэтому после инициализации объекта mysqli вы должны вызвать «метод» следующим образом:

array_walk($array, array($msqli, 'real_escape_string'));

Также, как упоминалось выше, array_walk будет вводить ключ и значение в объект mysql, который приведет к точному экранированию, вы должны использовать array_map для обхода только значений:

array_map($array, array($msqli, 'real_escape_string'));

9 голосов
/ 10 октября 2010

Как вы можете прочитать на php callback странице, вы должны использовать:

# produces an error
array_walk($array, array($msqli, 'real_escape_string'));
array_map($array, array($msqli, 'real_escape_string'));
0 голосов
/ 10 октября 2010

array_walk разрешает передавать в качестве обратного вызова только пользовательскую функцию, а не базовую функцию или метод PHP.Чтобы сделать это, я бы попробовал следующее:

foreach($array as &$value) {
    $value = $mysqli->real_escape_string($value);
}

Передача значения по ссылке позволяет изменять его в цикле foreach, в результате чего каждый элемент массива экранируется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...