3

我敢肯定这一定是以前在某个地方问过的,但我找不到答案:

如何从原生 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()没有找到第二个功能。那么如何正确引用呢?

4

2 回答 2

12

因为do_the_mapping它是一个对象的方法,而不是一个全局函数(这是你通过 using 暗示的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对该对象实例的引用即可。

于 2013-10-12T18:57:04.757 回答
3

我不认为你可以提供这样的回调,因为do_the_mapping它是控制器对象的一个​​函数。您必须根据文档将函数更改为静态:

<?php
class Foo extends CI_Controller {

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

并称它为array_map("Foo::do_the_mapping", $row);.

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

于 2013-10-12T18:55:07.533 回答