2

看看下面的插图:

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

任何帮助表示赞赏

4

6 回答 6

3

您可能需要闭包,它们是匿名函数。

于 2011-02-16T18:40:44.993 回答
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()功能范围内。

于 2011-02-16T18:41:02.547 回答
1

匿名函数可能是您正在寻找的

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

$greet('World');
$greet('PHP');
?>

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

于 2011-02-16T18:41:37.630 回答
1

如果您有权访问 >=PHP 5.3,则可以使用匿名函数,如果没有,则可以使用create_function

于 2011-02-16T18:43:30.157 回答
1

如果您没有 PHP 5.3,则可以使用该create_function功能。

于 2011-02-16T18:46:53.523 回答
1

有两种方法可以做到这一点。闭包/匿名函数可以从 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))));
于 2011-02-16T18:46:59.570 回答