PHP回调函数不能处理对象函数

时间:2010-10-10 15:37:20

标签: php arrays oop callback

我有一个数组,想要通过MySQLi->real_escape_string对数组的每个成员应用array_walk,但这不起作用:

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

它给出了这个错误:

  

警告:array_walk()期望参数2是有效的回调,函数'$ mysqli-> real_escape_string'未找到或在第69行的C:\ wamp \ www \ ts.tsp中无效的函数名称

$mysqli是一个有效的对象,如果我对$mysqli->real_escape_string('anything')进行其他操作,则可以正常工作。

我的问题:是否无法将对象的函数作为回调传递?或者我做错了什么。


重要提示:我知道我可以创建自己的回调函数并在其中实现$ mysqli-> real_escape_string BUT 我想知道是不是可以使用回调作为对象的功能?

4 个答案:

答案 0 :(得分:9)

正如您可以在php callback页面上阅读,您将使用:

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

答案 1 :(得分: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'));

答案 2 :(得分:0)

array_walk只允许用户定义的函数作为回调传递,而不是核心PHP函数或方法。要做到这一点,我会尝试以下方法:

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

通过引用传递值允许在foreach循环中修改它,导致数组的每个成员被转义。

答案 3 :(得分:0)

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