我有一个数组,并且想通过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 callback页上所见,您应使用:
# produces an error
array_walk($array, array($msqli, 'real_escape_string'));
array_map($array, array($msqli, 'real_escape_string'));
如果在对象内调用方法,则应传递一个数组,第一个是对象/上下文,第二个是方法:
小例子
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'));
array_walk仅允许将用户定义的函数作为回调传递,而不是核心PHP函数或方法。为此,我将尝试以下操作:
foreach($array as &$value) {
$value = $mysqli->real_escape_string($value);
}
通过引用传递值允许在foreach循环中对其进行修改,从而导致对数组的每个成员进行转义。
[我发现this post在弄清楚如何使array_walk()
在类中的方法中工作时非常有用。将它添加到此线程中以防其他人使用。