如何在PHP 5.2中实现PHP 5.2中的函数模板?

时间:2012-05-25 17:53:40

标签: php closures php-5.3 php-5.2

此代码在PHP 5.3中运行良好,但在PHP 5.2中运行不佳。你怎么能在PHP 5.2中实现这样的东西?

echo "Calling func....<br/>";
function template_func( $data=array(), $func ) {
    echo "<ul>";
    foreach ($data as $k => $v) {
        $func( $v );    
    }
    echo "</ul>";
}

$data = array( 1, 2, 3, 4, 5 );

template_func( $data, function ( $v ) { 
    echo "<li>$v</li>"; 
} );

template_func( $data, function ( $v ) { 
    echo "<li><span class='style'>$v</span></li>"; 
} );

2 个答案:

答案 0 :(得分:3)

您可以使用call_user_func() / call_user_func_array()。您必须将函数名称作为字符串传递。您也可以通过这种方式调用方法和静态方法please check the manual

您还可以使用is_callable()来验证参数是否可以作为函数调用。

call_user_func()的简单示例:

function template_func( $data=array(), $func ) {
    echo "<ul>";
    foreach ($data as $k => $v) {
        call_user_func($func, $v);    
    }
    echo "</ul>";
}

function spannedList ( $v ) { 
    echo "<li><span class='style'>$v</span></li>"; 
}
template_func($data, 'spannedList');

另一种方法是使用create_function()。这样,您甚至不必更改template_func()

的定义

答案 1 :(得分:2)

只需将匿名函数更改为create_function

template_func( $data, create_function( '$v', '
    echo "<li>$v</li>"; 
' ) );

template_func( $data, create_function( '$v', '
    echo "<li><span class=\'style\'>$v</span></li>"; 
' ) );