是否可以在PHP中使用不同的名称对函数进行别名?假设我们有一个名为sleep
的函数。有没有办法建立一个名为wait
的别名?
到现在我这样做:
function wait( $seconds ) {
sleep($seconds);
}
答案 0 :(得分:61)
是的,function wait ($seconds) { sleep($seconds); }
是要走的路。但如果您担心必须更改wait(),您应该更改sleep()的参数数量,那么您可能需要执行以下操作:
function wait() {
return call_user_func_array("sleep", func_get_args());
}
答案 1 :(得分:48)
答案 2 :(得分:26)
不,但你可以这样做:
$wait = 'sleep';
$wait($seconds);
这样你也可以解决arguments-numbers-issues
答案 3 :(得分:20)
如果你有PHP 5.3,你可以查看lambdas also
$wait = function($v) { return sleep($v); };
答案 4 :(得分:9)
如果你不关心使用PHP的“eval”指令(许多人都有真正的问题,但我没有),那么你可以使用这样的东西:
function 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();
答案 5 :(得分:7)
不,在PHP中没有快速的方法。该语言不提供别名功能而无需编写包装函数。
如果你真的真的需要这个,你可以write a PHP extension为你做这件事。但是,要使用扩展,您需要编译扩展并将PHP配置为此扩展,这意味着应用程序的可移植性将大大降低。
答案 6 :(得分:5)
不,函数不是一等公民,所以没有像{J}这样的J wait = sleep
。你基本上必须做你在问题中所做的事情:
function wait ($seconds) { sleep($seconds); }
答案 7 :(得分:5)
答案 8 :(得分:4)
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); // -> …
答案 9 :(得分:2)
如果您的PHP不支持 use x as y 语法,则在较旧的PHP版本中,您可以定义anonymous function:
$wait = create_function('$seconds', 'sleep($seconds);');
$wait(1);
或者将代码放在常量中,例如:
define('wait', 'sleep(1);');
eval(wait);
另请参阅:What can I use instead of eval()?
如果你需要很长的代码,并且你不想重复它,或者代码对新功能没用,那么这个功能特别有用。
还有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;
}
答案 10 :(得分:1)
没了。你写的方式是最好的方法。
答案 11 :(得分:1)
不,没有快速的方法这样做 - 至少对于PHP v5.3之前的任何事情,并且这也不是特别好的主意。这简直使问题复杂化。
答案 12 :(得分:0)
这对于使用魔术方法的类特别有用。
class User extends SomethingWithMagicMethods {
public function Listings(...$args) {
return $this->Children(...$args);
}
}
但我很确定它也适用于常规功能。
function UserListings(...$args) {
return UserChildren(...$args);
}
答案 13 :(得分:-1)
我知道这是旧的,但你总是可以
$wait = 'sleep';
$wait();
答案 14 :(得分:-2)
我在CLASS中使用的内容
function __call($name, $args) {
$alias['execute']=array('done','finish');
$alias['query']=array('prepare','do');
if (in_array($name,$alias['execute'])){
call_user_func_array("execute",$args);
return TRUE;
}elseif(in_array($name,$alias['query'])){
call_user_func_array("query",$args);
return TRUE;
}
die($this->_errors.' Invalid method:'.$name.PHP_EOL);
}