0

这是可以接受的吗?我需要为每个 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

4 回答 4

5

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

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

应该做你所追求的。

事后考虑,您可能想查看PHP DOM,因为这可能是要走的路,但需要一些时间来学习和习惯使用它。

于 2010-12-12T19:41:50.990 回答
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 往返更快。

于 2010-12-12T19:46:53.190 回答
1

无论如何,如果您要使用丑陋的hack,我宁愿这样做:

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

$html = 'create_html';

<<<example
<h1>Test</h1>
{$html('h2','Another test')}
example;
于 2010-12-12T19:46:12.993 回答
0

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

于 2010-12-12T20:44:09.143 回答