Имя динамической функции в php

Я хотел бы упростить создание «пользовательских типов сообщений» в WordPress, так как утомительно проходить один и тот же скрипт и снова и снова изменять все экземпляры имен типа почтового типа вручную.

Это довольно просто достичь, создав переменную, содержащую имя CPT, и используйте ее везде, где это необходимо. Таким образом, все, что мне нужно сделать, это объявить переменную в начале скрипта, и это должно заботиться обо всем остальном.

Единственная проблема заключается в том, что, чтобы заставить ее работать, мне также нужно префикс имени CPT перед каждой функцией внутри скрипта, и кажется, что использование переменной в имени функции непросто или даже рекомендуется в PHP.

Так как я могу это решить?

Ниже приведен пример ниже, чтобы было ясно:

$prefix = 'news'; function news_custom_type_init() { global $prefix; register_post_type($prefix, array( 'labels' => array( 'name' => $prefix, 'singular_label' => $prefix, 'add_new' => 'Add', ... )); register_taxonomy_for_object_type( 'category', $prefix ); } add_action('init', $prefix.'_custom_type_init'); 

Это почти нормально и может быть стандартизировано, если бы я мог динамически переименовывать функцию, чтобы не писать слово «новости» перед ней, а вместо этого использовать «префикс $».

Это может быть приятно, но просто не работает:

 $prefix = 'news'; $functionName= $prefix."_custom_type_init"; function $functionName() { global $prefix; register_post_type($prefix, array( 'labels' => array( 'name' => $prefix, 'singular_label' => $prefix, 'add_new' => 'Add', ... )); register_taxonomy_for_object_type( 'category', $prefix ); } add_action('init', $prefix.'_custom_type_init'); 

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

Какой был бы лучший способ сделать это?

PS: Я googled и «stackoverflowed» много об этом, но не нашел никакого рабочего решения, которое соответствует моим потребностям и не генерирует сообщение об ошибке WordPress.

Спасибо.

Related of "Имя динамической функции в php"

Достаточно просто, вот аналогичная отлаженная форма проекта:

 $function = $prefix . '_custom_type_init'; if(function_exists($function)) { $function(); } 

Это старый поток, но просто используйте анонимные функции:

 add_action('init', function() use($args) { //... }); 

Тогда нет необходимости объявлять так много функций.

Редактировать (2017-04): анонимные функции (правильно реализованы) – это путь, см. Ответ Дэвида Виэльхубера.

Этот ответ не рекомендуется , как и любой подход, который включает в себя код как строку, потому что это приглашает (помимо прочего) конкатенацию.


Я не уверен, если это целесообразно использовать, или если это вам поможет, но php позволяет создавать «анонимные» функции:

 function generateFunction ($prefix) { $funcname = create_function( '/* comma separated args here */', '/* insert code as string here, using $prefix as you please */' ); return $funcname; } $func= generateFunction ("news_custom_type_init"); $func(); // runs generated function 

Я предполагаю, что add_action просто вызывает любую переданную вами функцию.

http://php.net/manual/en/function.create-function.php

Примечание: create_function не вернет функцию с нужным именем, но содержимое функции будет находиться под вашим контролем, а реальное имя функции не имеет значения.

Я думаю, вы могли бы использовать

runkit_function_add

http://php.net/manual/pl/function.runkit-function-add.php

Еще один доступный метод – использовать eval()