61

是否可以在 PHP 中为具有不同名称的函数起别名?假设我们有一个名为 的函数sleep。有没有办法制作一个名为的别名wait

到目前为止,我正在这样做:

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

15 回答 15

66

直到 PHP 5.5

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

function wait() { 
  return call_user_func_array("sleep", func_get_args());
}
于 2009-11-06T16:40:50.310 回答
63

仅限 PHP 5.6+

从 PHP 5.6 开始,可以通过导入来给函数起别名:

use function sleep as wait;

文档中还有一个示例(请参阅“给函数起别名”)。

于 2014-05-02T10:48:20.387 回答
29

不,但你可以这样做:

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

这样您还可以解决参数编号问题

于 2009-11-06T16:40:04.150 回答
22

如果您有 PHP 5.3,您也可以查看lambdas

$wait = function($v) { return sleep($v); };
于 2009-11-06T16:42:33.677 回答
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();
于 2010-05-20T19:41:28.037 回答
6

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

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

于 2009-11-06T16:38:03.463 回答
5

不,函数不是一等公民,所以没有wait = sleep像 Javascript 这样的例子。你基本上必须做你提出的问题:

function wait ($seconds) { sleep($seconds); }
于 2009-11-06T16:34:33.267 回答
5

你可以使用 runkit 扩展

http://us.php.net/manual/en/function.runkit-function-copy.php

于 2009-11-06T16:45:40.997 回答
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); // -> …
于 2012-05-11T18:06:00.913 回答
3

如果你的 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; 
}
于 2015-03-17T14:34:00.223 回答
1

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

于 2009-11-06T16:33:56.657 回答
1

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

于 2009-11-06T16:34:28.873 回答
1

自 PHP 5.6 起

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

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

}

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

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

来源: PHP:新功能->“通过...的可变参数函数”

于 2017-03-06T00:07:00.477 回答
-1

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

$wait = 'sleep';
$wait();
于 2015-09-17T13:21:27.433 回答
-2

我在课堂上使用过的东西

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);
}
于 2014-07-21T17:09:13.663 回答