2015-11-10 2 views
0

Ниже приведен код, с которым я работаю.Создание имени функции «на лету» (динамически) - PHP

function my_tab($tabs) { 

    // the following array will be created dynamically 
    $colors = array("red", "white", "blue"); 

    foreach ($colors as $value) { 
     $tabs[$value] = array(
      'name' => $value 
     ); 

     // start creating functions 
     function content_for_[$value]() { 
      echo "this is the " .$value. " tab"; 
     } 
     // stop creating functions 

     add_action('content_for_'.$value, 'content_for_'.$value); 
    } 
    return $tabs; 

} 

Как вы можете видеть, у меня есть массив, который создается динамически. Для каждого color мне нужно создать function. Эти функции привязаны к hooks, а имена функций - exist. До сих пор все, что я пытался в течение последних 6 часов приводит к ошибке, аналогичной:

"call_user_func_array() expects parameter 1 to be a valid callback, function 'content_for_green' not found or invalid function name"

+0

Я предполагаю, что вы пытаетесь создать [крюк в Wordpress] (https://codex.wordpress.org/ Function_Reference/add_action)? Если вы подключаетесь к настраиваемому событию, ваш триггер должен передать значение '$ value' в качестве параметра. Я не эксперт Wordpress, но если вы делитесь кодом, который запускает действие, я, вероятно, могу вам помочь с некоторым примером. – RandomSeed

+0

Это то, о чем вы просите? do_action ("content_for _ {$ nav}", $ args); –

ответ

0

Если вы используете PHP> = 5.3, вы можете использовать anonymous functions, например,

add_action('content_for_' . $value, function() use ($value) { 
     echo "this is the " . $value . " tab"; 
    } 
); 

С use ключевого слова позволяет анонимной функции, чтобы захватить переменные из текущего объема (например, $value в вашем случае).

+0

Я поместил свой код в свой собственный файл. Заменил мою область создания функций вашим кодом. В конце я разместил content_for_red(); Это приводит к следующей ошибке ... Неустранимая ошибка: вызов неопределенной функции content_for_red() в C: \ xampp \ htdocs \ createfunction \ index.php в строке 22 –

+1

Спасибо vitozev. Ваш ответ был решением. У меня, должно быть, была опечатка в первый раз, когда я пытался. Спасибо!! –

0

Вы, безусловно, не хотите этого делать, это ужасная практика. Использование закрытий, as vitozev advises, разумно менее уродливое, но по-прежнему трудно поддерживать магию вуду.

Вместо этого просто добавьте параметр к вашему обратному вызову, например. расширяя существующий массив параметров:

function content_for_color_callback($args) { 
    echo 'this is the ' . $args['color'] . ' tab'; 
} 

Просто зарегистрируйте крюк:

add_action('content_for_color', 'content_for_color_callback'); 

... и передать color в качестве стандартного параметра:

// do not do this 
do_action("content_for_{$nav}", $args); 

// do this instead 
$args['color'] = $nav; 
do_action('content_for_color', $args); 

Одно из многих преимуществ с этим подходом заключается в том, что у вас гораздо меньше возможностей для неясных ошибок. Например, представьте, что кому-то хочется позвонить в несуществующую функцию content_for_bazinga(). С вашим подходом, вы получите смутное

Call to undefined function content_for_bazinga()

Сравнить с:

function content_for_color_callback($args) { 
    $color = $args['color']; 
    if(!colorIsValid($color)) { 
     throw new Exception("There is no such tab: $color"); 
    } 
    echo "This is the $color tab"; 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^