如何在PHP中为函数添加别名?

如何在PHP中为函数添加别名?,php,function,alias,Php,Function,Alias,是否可以在PHP中使用不同名称的函数别名?假设我们有一个名为sleep的函数。有没有办法让别名等待 现在我是这样做的: function wait( $seconds ) { sleep($seconds); } function func_alias($target, $original) { eval("function $target() { \$args = func_get_args(); return call_user_func_array('$original'

是否可以在PHP中使用不同名称的函数别名?假设我们有一个名为
sleep
的函数。有没有办法让别名
等待

现在我是这样做的:

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

没有。您编写的方法是最好的方法。

不,没有快速的方法可以做到这一点-至少对于PHPV5.3之前的任何东西,这样做也不是一个特别好的主意。这只会使事情复杂化

不,函数不是一等公民,因此没有像Javascript这样的
wait=sleep
。你基本上必须做你在问题中提出的事情:

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

不,在PHP中没有快速实现这一点的方法。该语言不提供在不编写包装器函数的情况下对函数进行别名的功能


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

不,但您可以这样做:

$wait = 'sleep';
$wait($seconds);
通过这种方式,在PHP 5.5之前,您还可以解决参数编号问题

是的,
函数wait($seconds){sleep($seconds);}
是一种方法。但是,如果您担心必须更改wait(),如果您更改sleep()的参数数量,则可能需要执行以下操作:

function wait() { 
  return call_user_func_array("sleep", func_get_args());
}
如果您有PHP5.3,您可以查看

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

您可以使用runkit扩展


如果您不关心使用PHP的“eval”指令(很多人对此有实际问题,但我没有),那么您可以使用以下内容:

function wait( $seconds ) {
    sleep($seconds);
}
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 5.6+ 可以通过导入函数来对其进行别名:

use function sleep as 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);
}

如果您的PHP不支持语法,则在旧版PHP中,您可以定义:

或将代码放在常数内,例如:

define('wait', 'sleep(1);');
eval(wait);
另见:

如果您有一段很长的代码,并且不想重复它,或者代码对新函数也不有用,那么这一点尤其有用


还有一个函数POST by,它对于创建用户函数的别名非常有用:

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

我知道这很古老,但你可以一直

$wait = 'sleep';
$wait();
从PHP5.6开始 这对于在具有魔术方法的类中使用尤其有用

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

}
但我很确定它也适用于常规函数

function UserListings(...$args) {
    return UserChildren(...$args);
}
资料来源:

您不必重新编译php。你可以编译这个模块,并通过php.ini包含它。非常正确的凯文,我已经更新了帖子以反映你的评论。不过,变量可能会变得非常混乱。我不认为这是解决问题的最好办法。@GSto这不是最好的办法。这只是一种可能性。我简直不敢相信它被提升了这么多:-)在PHP中有多少其他字符串内容是以这种方式被替换的?看起来像是集成到每个变量中的
eval()
。就像将解析器、预处理器和解释器混合到一种设计非常糟糕的语言中一样。注意:我不是PHP程序员(C++、Python和Javascript)。这些类型的结构是我当年开始使用PHP的原因。简单易懂,任何事情都有可能。仍然喜欢它。
func\u get\u args()
只有在PHP>5.3中才能这样工作,在PHP>5.3中,您可以在参数列表中使用它。在PHP<5.3中,必须使用一个临时变量:
$args=func_get_args();返回call\u user\u unc\u数组('sleep',$args)这是我的首选答案,因为它还允许您在类内别名一个静态方法,如下所示:call_user_func_array(array(“class”,“staticMethod”),func_get_args())@FriendlyDev您不能只使用
调用用户函数数组(“类::staticMethod”,func\u get\u args())相反?或者如果你真的想成为一名花花公子,
返回sleep(…func_get_args())
@AbiusX我有一个函数,其中第一个变量是通过引用的,因此这适用于
函数v(&$v){return Validate($v,…array_slice(func_get_args(),1));}
如何查找类的方法?以下是我知道的别名类的方法的所有方法(包括坏方法),静态和非静态:正确-我希望能够在我自己的类中为使用该类的人提供有用的别名。有时这是一种优雅的弃用方式(例如,框架的前一个版本有一个拼写错误的方法),而有时这只是一种很好的UX。如果在过程上下文中包含的文件中使用,它似乎无法全局工作。@VincentPoirier导入是每个文件,另一个文件不可能为您重新定义函数。这是否等同于?@Pang是的,但我的记忆力不太好,无法回答几个月前我为什么这么做。