用eval(PHP)定义一堆函数

时间:2010-12-12 19:39:56

标签: php function eval heredoc

这是否接近可以接受的东西?我需要为每个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,但它看起来还不错。无论如何,我的问题是:这是好的,还是更好的做法:

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

等等..?

4 个答案:

答案 0 :(得分:5)

您可以使用PHP提供的create_function但是......由于代码很简单,为什么不使用一个函数来统治它们呢?

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

应该做你想做的事。

作为一个想法,您可能想要查看PHP DOM,因为这可能是要走的路,但是需要一些时间来学习并习惯使用它。

答案 1 :(得分:2)

如果你能够更精细地生活:

 <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往返更快。

答案 2 :(得分:1)

如果你打算使用丑陋的黑客,我宁愿这样做:

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

$html = 'create_html';

<<<example
<h1>Test</h1>
{$html('h2','Another test')}
example;

答案 3 :(得分:0)

如果您使用的是PHP 5.3,则可以使用闭包。 优于create_function。避免使用eval()