【问题标题】:Can temporary functions/macros be created in PHP?可以在 PHP 中创建临时函数/宏吗?
【发布时间】:2011-06-28 14:02:03
【问题描述】:

请看下图:

// Trims input, fixes spaces and encodes bad glyphs. Also works with arrays.
function prepare_param($param)
{
    $retval = "";

    function prc($param)
    {
        $r = split(" ", trim($param));
        foreach($r as $i => $e)
            $r[$i] = urlencode($e);
        return join("+", $r);
    }

    // If input is an array
    if(is_array($param))
    {
        $retval = array();

        foreach($param as $e)
            $retval[] = prc($e);
    }
    // If input is a string
    else if(is_string($param))
    {
        return prc($param);
    }
    else throw new Exception("Invalid input! Expected String or Array.");
}

很明显,函数prc 现在将被全局声明,即使在函数内部声明也是如此。有没有办法遵循这个原则,在另一个函数中创建一个小函数/宏,以免乱扔全局范围?另一种方法是创建一个具有私有函数的类,这对我来说似乎有点过头了。

任何帮助表示赞赏

【问题讨论】:

    标签: php function macros temporary


    【解决方案1】:

    您可能想要closures,它们是匿名函数。

    【讨论】:

    • 迂腐注意:闭包与匿名函数的不同之处在于闭包包括范围。在 PHP 中,所有的闭包都是匿名函数,但并不是所有的匿名函数都是闭包。如果您包含 use ($var) 声明,这只是一个真正的闭包(但 PHP 的文档和内部表示将它们视为相同)...
    【解决方案2】:

    如果您有 PHP 5.3,请输入匿名函数:

    $prc = function($param)
    {
        $r = split(" ", trim($param));
        foreach($r as $i => $e)
            $r[$i] = urlencode($e);
        return join("+", $r);
    };
    
    if(is_array($param))
    {
        $retval = array();
    
        foreach($param as $e)
            $retval[] = $prc($e);
    }
    else if(is_string($param))
    {
        return $prc($param);
    }
    

    在这种情况下,$prc 仅存在于您的 prepare_param() 函数的范围内。

    【讨论】:

      【解决方案3】:

      如果您可以访问>=PHP 5.3,则可以使用anonymous functions,如果没有,则可以使用create_function

      【讨论】:

        【解决方案4】:

        如果您没有 PHP 5.3,可以使用 create_function 函数。

        【讨论】:

          【解决方案5】:

          有两种方法可以做到这一点。闭包/匿名函数可以从 PHP 5.3 开始,而老派的方法是使用 create_function() - 这很丑。

          但是,在您的情况下,您也不想要。创建或重新创建函数没有任何好处。您只需要它一次,因为它不依赖于任何初始化状态。您应该使用的成语称为“dererred definition”,在 PHP 中可以使用:

          if (!function_exists("prc")) {
              function prc($param) {
                  ...
              }
          }
          

          你应该用它的父函数作为前缀来命名它(例如prepare__prc)以避免冲突并表明它的内部使用。

          哦,顺便说一句,它也可以被简化压缩成:

          $param = join("+", array_map("urlencode", split(" ", trim($param))));
          

          【讨论】:

            【解决方案6】:

            anonymous functions 可能就是你要找的东西

            <?php
            $greet = function($name)
            {
                printf("Hello %s\r\n", $name);
            };
            
            $greet('World');
            $greet('PHP');
            ?>
            

            如果您不使用 php 5.3,请注意“create_function()”函数分配的内存在 php 进程完成之前不会释放。所以如果你创建了很多函数,你可能会遇到问题。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2023-02-21
              • 2017-11-13
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-07-11
              • 2021-05-18
              相关资源
              最近更新 更多