Определение набора функций с помощью eval (PHP) - PullRequest
0 голосов
/ 12 декабря 2010

Это где-нибудь рядом с чем-то приемлемым?Мне нужна функция для каждого тега HTML, и они должны быть определены для последующего использования в строке Heredoc.Пока это мой код.

<?php
$tags = array (h1, h2, h3, b, i);

foreach ($tags as $key => $value)
{
    eval ('function '.$value.' ($str) { return "<'.$value.'>$str</'.$value.'>"; }');
}

Это в основном решает проблему Heredoc, касающуюся функций внутри heredoc.Быстрый пример:

<<<example
<h1>This is ordinary HTML</h1>
{$h1('This is HTML via. PHP')}
example;

Я сделал весь код наизусть, поэтому, пожалуйста, не удивляйтесь, если они содержат какие-либо ошибки.Я еще не выполнил функцию eval, но она выглядит хорошо.Во всяком случае, мой вопрос будет: это хорошо, или лучше пойти и сделать это трудным путем:

function h1 ($str) { return ...; }
function h2 ($str) { return ...; }
function h3 ($str) { return ...; }
function b ($str) { return ...; }
function i ($str) { return ...; }

И так далее?

Ответы [ 4 ]

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

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

function createTag($tag, $text) {
     return "<{$tag}>{$text}</{$tag}>";
}

Должен делать то, что вы после.

В последствии вы можете захотеть проверить PHP DOM , так как это, вероятно, будет путь, но потребуется некоторое время, чтобы изучить его и привыкнуть к нему.

2 голосов
/ 12 декабря 2010

Если бы вы могли жить с более сложным:

 <h1>This is ordinary HTML</h1>     
 {$h->h1("This is HTML via PHP.")}

Тогда достаточно определить одно:

class html {
    function __call($name, $args) {
        return "<$name>$args[0]</$name>";
    }
}
$h = new html();

Быстрее, чем несколько обходных циклов eval для определения функций.

1 голос
/ 12 декабря 2010

Если вы все равно собираетесь использовать некрасивый хак, я бы предпочел сделать:

function create_html($tag, $val) {
    return "<{$tag}>{$val}</{$tag}>";
}

$html = 'create_html';

<<<example
<h1>Test</h1>
{$html('h2','Another test')}
example;
0 голосов
/ 12 декабря 2010

Если вы используете PHP 5.3, вы можете использовать замыкания. Far превосходит create_function.Избегайте eval().

...