我有一些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代码转换为不使用匿名函数的最佳方法是什么?感谢。
答案 0 :(得分: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();
答案 1 :(得分:7)
匿名函数非常适合短暂的一次性使用,例如Observer等模式中的事件侦听器。
但是,由于您已经形式化了一个接口(用于呈现名称,类别,创建日期和删除链接的回调),您可以采取额外步骤来定义需要这4种方法的“渲染器”界面。实施。您可以将单个渲染器子类传递给视图,而不是传递回调,然后可以使用该子类调用适当的方法。该视图还可以通过检查父类来验证它。这仍然允许您以便携式,可重复使用的OOP的精神交换渲染器,而无需匿名功能。
您的回调是否会来自任意代码(例如插件)?如果没有,那么使这些回调匿名是没有好处的。看起来你可能正在保存一个小名称空间膨胀,但你也使调试或文档变得更难。