如何从本机php函数引用codeigniter函数名作为回调?

时间:2013-10-12 18:45:52

标签: php codeigniter

我确信在某个地方之前一定要问这个问题,但我找不到答案:

如何从本机php函数的回调参数引用Codeigniter函数的名称,例如array_map()

作为一个简单示例,我在CI_Controller

中包含此代码
function test(){
    $row = array('foo', 'bar');
    $new_row = array_map('do_the_mapping', $row);
    echo $new_row[0];
}

function do_the_mapping($row){
    return($row . $row);
}

do_the_mapping()没有找到第二个功能。那么如何正确引用呢?

2 个答案:

答案 0 :(得分:9)

由于do_the_mapping是一个对象的方法,而不是一个全局函数(这是你使用array_map('do_the_mapping'...所暗示的),你必须将一个数组传递给array_map函数在第一个参数中。

这个数组必须包含两个项目,第一个(索引0)是对象实例的引用,第二个(索引1)是方法名称的字符串表示。

例如,如果您的控制器类似于以下内容:

class Some_page extends CI_Controller {

    public function test()
    {
        $row = array('foo', 'bar');
        $new_row = array_map('do_the_mapping', $row);
        echo $new_row[0];
    }

    public function do_the_mapping($row)
    {
        return($row . $row);
    }

}

你必须改变这个:

array_map('do_the_mapping', $row)

对此:

array_map(array($this, 'do_the_mapping'), $row);

如果你想调用另一个对象的方法,可以简单地将$this更改为对该对象实例的引用。

答案 1 :(得分:2)

我认为你不能像这样提供回调,因为do_the_mapping是控制器对象的一个​​功能。您必须根据documentation

将函数更改为静态
<?php
class Foo extends CI_Controller {

    public static function do_the_mapping($row) {
        return ($row . $row);
    }
}

并将其称为array_map("Foo::do_the_mapping", $row);

[edit]更彻底地阅读documentation,您不需要静态函数,但可以将对象提供给回调:array_map(array($this, "do_the_mapping"), $row);