看一下下图:
// 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
现在将全局声明,即使在函数内声明。有没有办法遵循这个原则,在另一个函数内创建一个微小的函数/宏,以免乱丢全局范围?另一种方法是创建一个具有私有功能的类,这对我的使用来说似乎有些过分。
任何帮助表示赞赏
答案 0 :(得分:3)
你可能想要closures,它们是匿名函数。
答案 1 :(得分: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()
函数的范围内。
答案 2 :(得分:1)
anonymous functions可能就是你要找的东西
<?php
$greet = function($name)
{
printf("Hello %s\r\n", $name);
};
$greet('World');
$greet('PHP');
?>
如果你不使用php 5.3,请注意“PHP create_function()
”函数分配的内存在php进程完成之前不会被释放。因此,如果您创建了许多函数,则可能会遇到问题。
答案 3 :(得分:1)
如果您有权访问&gt; = PHP 5.3,则可以使用anonymous functions,如果没有,则可以使用create_function。
答案 4 :(得分:1)
如果您没有PHP 5.3,则可以使用create_function
功能。
答案 5 :(得分:1)
有两种方法可以做到这一点。从PHP 5.3开始可以使用闭包/匿名函数,而oldschool的方法是使用create_function()
- 这非常难看。
但是在你的情况下,你也不想要。创建或重新创建功能没有任何好处。您只需要一次,因为它不依赖于任何初始化状态。你应该使用的习语称为“dererred definition”,可以在PHP中使用:
if (!function_exists("prc")) {
function prc($param) {
...
}
}
您应该使用其父函数将其命名为前缀(例如prepare__prc
),以避免冲突并发出内部使用信号。
哦,顺便说一句,它也可以简化压缩成:
$param = join("+", array_map("urlencode", split(" ", trim($param))));