【问题标题】:PHP Callback function not working on object functionsPHP回调函数不适用于对象函数
【发布时间】:2010-10-10 15:37:19
【问题描述】:

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

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 但是我想知道是否不能将回调用作对象的功能?

【问题讨论】:

    标签: php arrays oop callback


    【解决方案1】:

    如果你在一个对象中调用一个方法,你应该传入一个数组,第一项是对象/上下文,然后第二项应该是方法:

    小例子

    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】:

      正如您在php callback 页面上看到的,您应该使用:

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

      【讨论】:

      • 不,不起作用。它说:Warning: array_walk() expects parameter 2 to be a valid callback, non-static method mysqli::real_escape_string() cannot be called statically
      • 那是带引号的,当你完全按照你写的方式使用时,它说:Warning: mysqli::real_escape_string() expects exactly 1 parameter, 2 given
      • 使用array_map,它似乎工作(php.net/manual/en/function.array-map.php#63279
      【解决方案3】:

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

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

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

      【讨论】:

      • 我知道我能做到。我只是问有没有办法通过非静态方法?
      • 问题在于array_walk,因为它只能与用户定义的函数或方法一起使用。按照 Aif 的建议尝试 array_map,按照 Aif 的建议将对象和方法名称作为数组传递。
      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2021-07-14
        • 1970-01-01
        • 1970-01-01
        • 2011-12-28
        • 2022-11-09
        • 2012-08-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多