Преобразование кода с анонимными функциями в 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') :

 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.

Однако, поскольку вы уже оформляли интерфейс (обратные вызовы для рендеринга имен, категорий, дат создания и ссылки удаления), вы также можете перейти к дополнительному шагу определения интерфейса «renderer», который требует, чтобы эти 4 метода были реализованы. Вместо того, чтобы передавать обратные вызовы, вы должны передать один подкласс визуализации в представление, которое затем можно было бы использовать для вызова соответствующих методов. Представление также может проверить его, проверив родительский класс. Это все равно позволит вам обменивать рендереры в духе портативного многоразового ООП, не требуя анонимных функций.

Есть ли ситуация, когда ваши обратные вызовы будут возникать из произвольного кода (например, плагины)? Если нет, нет никакой выгоды, чтобы сделать эти обратные вызовы анонимными. Может показаться, что вы сохраняете небольшое разрастание пространства имен, но вы также усложняете отладку или документирование.