【问题标题】:Defining a bunch of functions with eval (PHP)用 eval (PHP) 定义一堆函数
【发布时间】:2011-05-24 08:12:12
【问题描述】:

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

等等..?

【问题讨论】:

    标签: php function eval heredoc


    【解决方案1】:

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

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

    应该做你所追求的。

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

    【讨论】:

    • 老实说,我在谷歌上搜索那个宝贝太难了!非常感谢:-)
    【解决方案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 往返更快。

    【讨论】:

      【解决方案3】:

      如果你还是要使用丑陋的 hack,我宁愿这样做:

      function create_html($tag, $val) {
          return "<{$tag}>{$val}</{$tag}>";
      }
      
      $html = 'create_html';
      
      <<<example
      <h1>Test</h1>
      {$html('h2','Another test')}
      example;
      

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-09-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-17
          • 2011-06-21
          相关资源
          最近更新 更多