2010-09-28 97 views
11

我有一些PHP 5.3代码构建要传递给视图的数组。这是我的代码。使用匿名函数将代码转换为PHP 5.2

# 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代码转换为不使用匿名函数的最好方法是什么?谢谢。

+1

何时以及如何以及为什么这些回调被称为? – deceze 2010-09-28 03:12:21

+0

@deceze该数组传递给一个视图,该视图处理数组并从数据创建一个表。每个列中的数据都会调用回调来格式化数据。 因此,如果表格单元值是第一列中的“船”,则该视图会将其处理为值'Boats 我并不是真的想改变视图,因为我有很多控制器使用它。 – NeedsEducation 2010-09-28 03:15:25

回答

8

你可以调用这些函数中的一个,像这样:

$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')

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(); 
+0

谢谢我所需要的。 – NeedsEducation 2010-09-28 04:56:49

7

匿名函数非常适用于短暂的一次性事件,如Observer等模式中的事件监听器。但是,由于您已经对接口进行了形式化(回调函数用于渲染名称,类别,创建日期和删除链接),所以您可能需要额外定义一个需要4种方法的“渲染器”接口将要执行。不是传递回调函数,而是将单个渲染器子类传递给视图,然后可以用它来调用适当的方法。该视图也可以通过检查父类来验证它。这仍然允许您在不需要匿名函数的情况下以可移植,可重用的OOP的精神交换渲染器。

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

+3

+1表示更清洁的OOP方法...可以使用源代码示例? – gnarf 2010-09-28 03:58:41

+0

我杰夫,谢谢你的回答,你说的话很有意义。对不起,我没有把你的答案标记为正确的,我收到的两个答案都是正确的(下一次我会按你说的方式去做)。 – NeedsEducation 2010-09-28 04:58:04

+0

没问题!我很高兴我们都可以提供帮助。 :) – 2010-09-28 05:12:30