将具有匿名函数的代码转换为PHP 5.2

我有一些PHP 5.3代码构建了一个数组传递给视图。 这是我的代码。

# Select all this users links.
$data = $this->link_model->select_user_id($this->user->id);
if (count($data) > 0) {
    # Process the data into the table format.
    $table = array
    (
        'properties' => array
        (
            'delete_link_column' => 0,
        ),
        'callbacks' => array
        (
            # Callback for the name link.
            function($value) {
                return sprintf('<a href="/links/view/name/%s">%s</a>', $value, $value);
            },
            # Callback for the category link.
            function($value) {
                return sprintf('<a href="/category/view/name/%s">%s</a>', $value, $value);
            },
            # Callback for the creation date.
            function($value) {
                return date('jS M Y', $value);
            },
            # Callback for the delete link.
            function($value) {
                return sprintf('<a href="links/delete/name/%s">delete</a>', $value);
            },
        ),
        'columns' => array
        (
            'name', 'category', 'creation date',
        ),
        'data' => array
        (

        ),
        'sorting' => array
        (
            'sort' => false,
        ),
    );

然而,问题是我不能在PHP 5.2中使用匿名函数,这是我必须上传这个作业的服务器。 该视图需要定义回调函数,以便可以调用它们。

将这个PHP代码转换为不使用匿名函数的最好方法是什么? 谢谢。


你可以像这样调用其中一个函数:

$func = $callbacks[0];
$func();

这也适用于create_function()并使用字符串作为命名函数,如下所示:

function test() {
  echo "test";
}
$func = 'test';
$func();

$func = create_function('' , 'echo "test 2"; ');
$func();

另外,如果调用是使用call_user_func完成的,则可以使用array($object, 'func_name')来调用对象或具有array('Class_Name', 'func_name')的类的公共方法array('Class_Name', 'func_name')

class Test {
  public static function staticTest() { echo "Static Test"; }
  public function methodTest() { echo "Test"; }

  public function runTests() {
    $test = array('Test', 'staticTest');
    call_user_func($test);

    $test = array($this, 'methodTest');
    call_user_func($test);
  }
}

$test = new Test();
$test->runTests();

匿名函数非常适用于短暂的一次性事件,如Observer等模式中的事件监听器。

然而,既然你已经形式化了一个接口(渲染名字,类别,创建日期和删除链接的回调函数),你可能需要额外的一步来定义一个需要实现4种方法的“渲染器”接口。 不是传递回调函数,而是将单个渲染器子类传递给视图,然后可以用它来调用适当的方法。 该视图也可以通过检查父类来验证它。 这仍然允许您在不需要匿名函数的情况下以可移植,可重用的OOP的精神交换渲染器。

有没有一种情况,你的回调会来自任意代码(例如插件)? 如果没有,那么匿名回调就没有任何好处。 它看起来像是在保存一个小的命名空间,但是也会让调试或文档变得更加困难。

链接地址: http://www.djcxy.com/p/59143.html

上一篇: Converting code with Anonymous functions to PHP 5.2

下一篇: Is there a foreach loop in Go?