在array_map中设置回调函数给出错误

时间:2014-11-03 14:14:58

标签: php callback

class Test
{
    public $callback = "sqrt";

    public function cube($n)
    {
        return($n * $n * $n);
    }   

    public function cool()
    {
        $a = array(1, 2, 3, 4, 5);
        $b = array_map( $this->callback , $a);
        var_dump($b);
    }   
}

$t = new Test();
$t->cool();

在此代码中,如果$ 回调设置为 intval sqrt ,那么它将正常工作,但当我尝试使用 cube 方法作为回调函数,它给出了以下错误。为什么这样 以及如何从方法调用方法 cube 作为回调

enter image description here

3 个答案:

答案 0 :(得分:2)

在PHP中,您可以使用数组将对象和方法调用关联为可调用

array_map(array($this, $this->callback), $array);

http://php.net/manual/en/language.types.callable.php

答案 1 :(得分:1)

试试这个:

$b = array_map( array($this, $this->callback) , $a);

输出是:

array
  0 => int 1
  1 => int 8
  2 => int 27
  3 => int 64
  4 => int 125

如果是静态方法:

$b = array_map( "Test::staticMethodName" , $a);

<强>更新

好的,问题是,当您将此参数提供给array_map时,它会解析您班级属性callback中的内容。有一个字符串值:cube。您没有全局cube功能。 intvalsqrt是全局函数,因此它们可以正常工作。所以你需要传递PHP文档说:A method of an instantiated object is passed as an array containing an object at index 0 and the method name at index 1.

这就是我的示例有效的原因,因为您有一个实例化的方法$this,以及$this->callback中的方法名称。

对于静态方法:

Static class methods can also be passed without instantiating an object of that class by passing the class name instead of an object at index 0. As of PHP 5.2.3, it is also possible to pass 'ClassName::methodName'.

答案 2 :(得分:0)

试试这个

$b = array_map(array($this, 'cube'), $a);

而不是

$b = array_map( $this->callback , $a);