是否可以在 PHP 中为具有不同名称的函数起别名?假设我们有一个名为 的函数sleep
。有没有办法制作一个名为的别名wait
?
到目前为止,我正在这样做:
function wait( $seconds ) {
sleep($seconds);
}
是的,function wait ($seconds) { sleep($seconds); }
这是要走的路。但是,如果您担心在更改 sleep() 的参数数量时必须更改 wait(),那么您可能需要执行以下操作:
function wait() {
return call_user_func_array("sleep", func_get_args());
}
不,但你可以这样做:
$wait = 'sleep';
$wait($seconds);
这样您还可以解决参数编号问题
如果您有 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); }");
}
我在一些简单的测试中使用它,它似乎工作得相当好。这是一个例子:
function hello($recipient) {
echo "Hello, $recipient\n";
}
function helloMars() {
hello('Mars');
}
func_alias('greeting', 'hello');
func_alias('greetingMars', 'helloMars');
greeting('World');
greetingMars();
不,在 PHP 中没有快速的方法可以做到这一点。该语言不提供在不编写包装函数的情况下对函数进行别名的能力。
如果你真的真的需要这个,你可以编写一个 PHP 扩展来为你做这件事。但是,要使用该扩展,您需要编译您的扩展并将 PHP 配置给我们这个扩展,这意味着您的应用程序的可移植性将大大降低。
不,函数不是一等公民,所以没有wait = sleep
像 Javascript 这样的例子。你基本上必须做你提出的问题:
function wait ($seconds) { sleep($seconds); }
你可以使用 runkit 扩展
http://us.php.net/manual/en/function.runkit-function-copy.php
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);
另请参阅:我可以使用什么来代替 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;
}
不。你写的方式是最好的方式。
不,没有快速的方法可以做到这一点——至少对于 PHP v5.3 之前的任何东西,这样做也不是一个特别好的主意。它只会使事情复杂化。
这对于在具有魔术方法的类中使用特别有用。
class User extends SomethingWithMagicMethods {
public function Listings(...$args) {
return $this->Children(...$args);
}
}
但我很确定它也适用于常规功能。
function UserListings(...$args) {
return UserChildren(...$args);
}
我知道这是旧的,但你总是可以
$wait = 'sleep';
$wait();
我在课堂上使用过的东西
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);
}