Подтвердить что ты не робот

Преобразование кода с анонимными функциями в 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-код, чтобы не использовать анонимные функции? Спасибо.

4b9b3361

Ответ 1

Вы можете вызвать одну из следующих функций:

$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();

Ответ 2

Анонимные функции отлично подходят для эфемерных одноразовых событий, таких как прослушиватели событий в таких шаблонах, как Observer.

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

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