PHP回调函数不适用于对象函数

问题描述 投票:5回答:4

我有一个数组,并且想通过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 BUT我想知道是否不可能将回调用作对象的函数?

php arrays oop callback
4个回答
9
投票

如您在php callback页上所见,您应使用:

# produces an error
array_walk($array, array($msqli, 'real_escape_string'));
array_map($array, array($msqli, 'real_escape_string'));

9
投票

如果在对象内调用方法,则应传递一个数组,第一个是对象/上下文,第二个是方法:

小例子

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'));


0
投票

array_walk仅允许将用户定义的函数作为回调传递,而不是核心PHP函数或方法。为此,我将尝试以下操作:

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

通过引用传递值允许在foreach循环中对其进行修改,从而导致对数组的每个成员进行转义。


0
投票

[我发现this post在弄清楚如何使array_walk()在类中的方法中工作时非常有用。将它添加到此线程中以防其他人使用。

© www.soinside.com 2019 - 2024. All rights reserved.