在PHP中,是否可以将函数用不同的名称进行别名处理?假设我们有一个名为 sleep
的函数。是否有方法可以创建一个名为 wait
的别名?
目前我是这样做的:
function wait( $seconds ) {
sleep($seconds);
}
没错,function wait ($seconds) { sleep($seconds); }
是正确的方法。但是如果你担心需要改变 wait() 函数,例如当 sleep() 的参数数量发生变化时,那么你可以考虑使用下面的方法:
function wait() {
return call_user_func_array("sleep", func_get_args());
}
从PHP 5.6开始,可以通过导入来将函数别名化:
use function sleep as wait;
文档中还有一个示例(请参见“别名函数”):documentation。
不行,但你可以这样做:
$wait = 'sleep';
$wait($seconds);
这样做还可以解决参数数量问题。
eval()
。就像混合解析器、预处理器和解释器融为一体的一种非常糟糕设计的语言。注意:我不是PHP程序员(C ++,Python和Javascript)。 - Brian Cannardfunction func_alias($target, $original) {
eval("function $target() { \$args = func_get_args(); return call_user_func_array('$original', \$args); }");
}
我在一些简单的测试中使用了它,似乎效果还不错。以下是一个示例:
function hello($recipient) {
echo "Hello, $recipient\n";
}
function helloMars() {
hello('Mars');
}
func_alias('greeting', 'hello');
func_alias('greetingMars', 'helloMars');
greeting('World');
greetingMars();
wait = sleep
那样的方法。你基本上必须按照你在问题中提出的方式进行操作:function wait ($seconds) { sleep($seconds); }
function alias($function)
{
return function (/* *args */) use ($function){
return call_user_func_array( $function, func_get_args() );
};
}
$uppercase = alias('strtoupper');
$wait = alias('sleep');
echo $uppercase('hello!'); // -> 'HELLO!'
$wait(1); // -> …
如果你的PHP不支持use x as y语法,那么在旧版本的PHP中,你可以定义匿名函数:
$wait = create_function('$seconds', 'sleep($seconds);');
$wait(1);
或者将代码放在常量内,例如:
define('wait', 'sleep(1);');
eval(wait);
如果您有很长的代码段,而且不想重复使用它,或者该代码对于新函数也没有用处,那么这就特别有用。
还有一个由Dave H发布的函数,非常适用于创建用户函数别名:
function create_function_alias($function_name, $alias_name)
{
if(function_exists($alias_name))
return false;
$rf = new ReflectionFunction($function_name);
$fproto = $alias_name.'(';
$fcall = $function_name.'(';
$need_comma = false;
foreach($rf->getParameters() as $param)
{
if($need_comma)
{
$fproto .= ',';
$fcall .= ',';
}
$fproto .= '$'.$param->getName();
$fcall .= '$'.$param->getName();
if($param->isOptional() && $param->isDefaultValueAvailable())
{
$val = $param->getDefaultValue();
if(is_string($val))
$val = "'$val'";
$fproto .= ' = '.$val;
}
$need_comma = true;
}
$fproto .= ')';
$fcall .= ')';
$f = "function $fproto".PHP_EOL;
$f .= '{return '.$fcall.';}';
eval($f);
return true;
}
create_function()
自PHP 7.2起已被弃用,并在PHP 8.0中删除。强烈不建议使用它。 - MAChitgarha
func_get_args()
才能在参数列表中使用,像这样工作。在PHP < 5.3中,您需要使用临时变量:$args = func_get_args(); return call_user_unc_array('sleep', $args);
。 - Markocall_user_func_array("TheClass::theStaticMethod", func_get_args());
呢? - DiegoDDreturn sleep(...func_get_args());
。 - Brian Leishmanfunction v(&$v) { return Validate($v, ...array_slice(func_get_args(), 1)); }
- Brian Leishman