我们可以在php中使用别名吗?

有没有可能在PHP中别名一个不同名称的函数? 如果是的话如何?

假设我们有这个函数sleep();

有什么快速的方法来做一个别名叫wait();

没有写这个代码

function wait ($seconds) { sleep($seconds); } 

仅PHP 5.6+

从PHP 5.6开始, 可以通过导入它来为函数添加别名:

 use function sleep as wait; 

直到PHP 5.5

yup, function wait ($seconds) { sleep($seconds); } function wait ($seconds) { sleep($seconds); }是要走的路。 但是,如果您担心需要更改wait(),那么您应该更改sleep()的参数数量,则可能需要执行以下操作:

 function wait() { return call_user_func_array("sleep", func_get_args()); } 

不,但你可以这样做:

 $wait = 'sleep'; $wait($seconds); 

这样你也可以解决arguments-number-issues

如果你有PHP 5.3,你也可以看看lambdas

 $wait = function($v) { return sleep($v); }; 

如果你不关心使用PHP的“eval”指令(很多人有一个真正的问题,但我不这样做),那么你可以使用这样的东西:

 function func_alias($target, $original) { eval("function $target() { \$args = func_get_args(); return call_user_func_array('$original', \$args); }"); } 

我在一些简单的testing中使用它,似乎工作得很好。 这里是一个例子:

 function hello($recipient) { echo "Hello, $recipient\n"; } function helloMars() { hello('Mars'); } func_alias('greeting', 'hello'); func_alias('greetingMars', 'helloMars'); greeting('World'); greetingMars(); 

不,PHP没有快速的方法。 如果不编写包装函数,语言不提供别名函数的function。

如果你真的真的需要这个,你可以写一个PHP扩展 ,为你做这个。 但是,要使用扩展名,需要编译扩展名,并将PHPconfiguration为扩展名,这意味着应用程序的可移植性将大大降低。

不,function不是一stream的公民,所以没有像Javascript这样的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不支持将x用作y语法,则在较旧的PHP版本中,您可以定义匿名函数 :

 $wait = create_function('$seconds', 'sleep($seconds);'); $wait(1); 

或者把代码放在常量中,例如:

 define('wait', 'sleep(1);'); eval(wait); 

另请参阅: 我可以使用什么而不是eval()?

如果你有很长的一段代码,而且你不想重复它,或者这个代码对于一个新的函数没有用处,这是特别有用的。


还有Dave H发布的函数,这对创build用户函数的别名非常有用:

 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; } 

不。 你写的方式是最好的办法。

不,没有快捷的方法 – 至less在PHP v5.3之前的任何情况下,这样做也不是一个好主意。 它只是使问题复杂化。

我知道这是旧的,但你可以随时

 $wait = 'sleep'; $wait(); 

自PHP 5.6以来

这对于使用魔术方法的类特别有用。

 class User extends SomethingWithMagicMethods { public function Listings(...$args) { return $this->Children(...$args); } } 

但我很确定它也适用于常规function。

 function UserListings(...$args) { return UserChildren(...$args); } 

来源: PHP:新function – >“variablesfunction通过…”

我在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); }