Определение функции с именем из переменной? - PullRequest
2 голосов
/ 04 декабря 2010

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

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

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

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

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

Ответы [ 2 ]

5 голосов
/ 04 декабря 2010

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

Пример:

$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

, если вы используете PHP 5.3 или выше, вы можете сделать что-то вроде этого:

$$value = function()
{

}

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

0 голосов
/ 04 декабря 2010

Я не уверен, как WP вызывает функции, но если он использует 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));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...