PHP 在允许你通过使用 func_* 函数向函数发送可变长度的参数列表方面非常出色。但是,不幸的是(这在 PHP 的 bug 报告/功能请求中被反复提及),它不支持按引用传递参数,这将极大地简化通过简单地执行 somefunction($a, $b, $c) 并处理它们来一次处理多个变量的过程,而无需进行任何额外的赋值。
但是,我发现了一种利用 PHP 的几个功能的方法,并创建了一个非常好的示例,展示了如何一次性处理多个变量!
用法如下(使用我的示例函数/类):
"list($a, $b, $c, $d, $e) = TextEscape::escape_multi($a, $b, $c, $d, $e);"
如果 PHP 实际上能够在使用可变长度参数列表时按引用传递变量,那么这可以简化为
"TextEscape::escape_multi($a, $b, $c, $d, $e);"
它非常接近,在简洁性和速度方面都非常接近。请务必始终在该语句的两侧使用相同数量和顺序的参数。
使用静态类只是为了使代码更简洁、更易于查看。这可以应用于任何函数!
现在,让我们来看代码,尽情享受这种非凡的技巧,并享受在一个语句中同时修改多个变量的乐趣! ;-)
<?php
class TextEscape
{
public static function escape_string($sString)
{
return htmlspecialchars($sString);
}
public static function escape_multi()
{
$aVariables = func_get_args();
foreach ($aVariables as $iKey => $sValue)
{
$aVariables[$iKey] = TextEscape::escape_string($sValue);
}
return $aVariables;
}
}
$a = "A<bar";
$b = "B>bar";
$c = "C<bar";
$d = "D>bar";
$e = "E<bar";
print_r(array($a, $b, $c, $d, $e));
list($a, $b, $c, $d, $e) = TextEscape::escape_multi($a, $b, $c, $d, $e);
print_r(array($a, $b, $c, $d, $e));
?>
这是代码的简洁版本,它准确地说明了正在发生的事情。
我还制作了一个速度狂热版本的函数,但不想将其作为主要示例发布,因为它更难阅读。
但它更快,快得多!它在可以的地方按引用传递,并以更高效的方式循环。
只需用以下函数替换上面的函数,结果相同,但速度更快。
<?php
class TextEscape
{
public static function escape_string(&$sString) {
$sString = htmlspecialchars($sString);
}
public static function escape_multi()
{
$aVariables = func_get_args();
for ($i=(count($aVariables)-1); $i>=0; $i--) {
TextEscape::escape_string($aVariables[$i]); }
return $aVariables;
}
}
?>
享受!