2010-12-04 2 views
2

Мне нужно создать колонку-систему для Wordpress с короткими кодами, что не проблема, но я пытаюсь сделать это с меньшим количеством кода.Определение функции с именем из переменной?

У меня есть массив с необходимыми данными, я прокручиваю его, создаю уникально-названную функцию и устанавливаю ее как функцию shortcode. Третий шаг - загадка. Как создать функцию из переменной.

Вот пример, как это должно быть сделано:

$data[] = "first"; 
$data[] = "second"; 
foreach($data as $key => $value) { 
    function $value($atts,$content) { 
     return '<div class="'.$value.'">'.$content.'</div>'; 
    } 
    add_shortcode($value,$value); 
} 

Тем не менее, кажется, что это не возможно, чтобы заставить его работать, как, что в PHP. Есть ли способ сделать эту работу, поскольку я бы не хотел писать все (идентичные) функции, разделенные. Я мог бы сделать shortcode что-то вроде [col first]text[/col], но клиент хочет иметь разные имена для каждого из них.

ответ

5

вы можете использовать синтаксис двойной долларовый использовать значение переменной в качестве идентификатора переменной,

Пример:

$variable = "test"; 
$$variable = "value of test" 

echo $test; //or echo $$variable; 

Я никогда не пробовал, но вам путь хотите попробовать:

foreach($data as $key => $value) 
{ 
    function $$value($atts,$content) 
    { 
    } 
    add_shortcode($value,$value); 
} 

или функции, как create_function

, если вы используете PH P 5,3 или больше, то вы можете сделать что-то вроде этого:

$$value = function() 
{ 

} 

, который должен работать нормально

+0

создать префикс функции с `$` до сих пор не разрешен в PHP. И для lamda-стиля, точно не используется имя функции `$ value` как функция, чтобы позволить PHP решить уникальное имя. – ajreal 2010-12-05 15:44:58

0

Я не уверен, как WP invocates функции, но если он использует call_user_func, то вы можете обмануть, используя объект с виртуальными методами:

class fake_functions { 
    function __call($name, $params) { 
     return '<div class="'.$name.'">'.$params[1].'</div>'; 
    } 
} 

$obj = new fake_functions(); 
foreach ($data as $value) { 
    add_shortcode($value, array($obj,$value)); 
} 
Смежные вопросы