将带有匿名函数的代码转换为PHP5.2

将带有匿名函数的代码转换为PHP5.2,php,anonymous-function,Php,Anonymous Function,我有一些PHP5.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 ( 'prop

我有一些PHP5.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,
        ),
    );
然而,问题是我不能在PHP5.2中使用匿名函数,这是我必须上传此作业的服务器。视图需要定义回调函数,以便调用它们


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

匿名函数对于短暂的一次性事件非常有用,比如Observer等模式中的事件侦听器

但是,由于您已经为呈现名称、类别、创建日期和删除链接形式化了接口回调,因此您还可以进一步定义“呈现器”接口,该接口需要实现这4种方法。您不需要传递回调,而是将单个呈现器子类传递给视图,然后可以使用该子类调用适当的方法。视图还可以通过检查父类来验证它。这仍然允许您本着可移植、可重用OOP的精神交换渲染器,而不需要匿名函数


您的回调是否会来自任意代码(例如插件)?如果不是这样,那么匿名回调就没有什么好处了。看起来您似乎在节省一点名称空间膨胀,但同时也使调试或记录变得更加困难。

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

$func = $callbacks[0];
$func();
这也适用于命名函数的字符串,例如:

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

$func = create_function('' , 'echo "test 2"; ');
$func();
此外,如果使用完成调用,则可以使用数组$object、'func_name'调用对象或具有数组'class_name','func_name'的类上的公共方法:


何时、如何以及为什么调用这些回调?@deceze此数组被传递给一个视图,该视图处理该数组并从数据创建一个表。对每列中的数据调用回调以格式化数据。因此,如果表单元格值在第一列中为“Boats”,则视图会将其处理为“我真的不想更改视图,因为我有很多控制器像这样使用它”。+1用于建议更干净的OOP方法。。。可以使用一个源代码示例吗?@Jeff,要这样做,我们需要为每个匿名函数创建一个新的子类。除非有办法实现匿名类,否则这是无法维护和毫无意义的。@gnarf,没有源示例是有原因的。因为这个方法一点也不干净。这本质上需要为每个回调创建一个新的子类。所以,如果你需要10次回调,你将需要创建10个新类,从子类1到子类10。@JeffStanden,这只是他提出的一个例子。在任何非平凡的应用程序中,你都可以找到数百个匿名函数。这意味着使用您的解决方案,我们需要声明数百个新的子类。这不是个好主意。@JeffStanden,数百个匿名函数绝对不是设计问题。实际上,以函数方式编写代码需要数百个匿名函数。create_函数不必为函数指定名称。唯一不礼貌的是身体必须是一根绳子,否则它就完全正常了。而且,它有一个生命周期,并且不仅仅是在旧代码中附加特性。所以,不要惊讶于这个问题在现在和将来仍然有效,它还远没有实际意义。
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();