如何在PHP中使用别名函数?

时间:2009-11-06 16:31:08

标签: php function alias

是否可以在PHP中使用不同的名称对函数进行别名?假设我们有一个名为sleep的函数。有没有办法建立一个名为wait的别名?

到现在我这样做:

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

15 个答案:

答案 0 :(得分:61)

直到PHP 5.5

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

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

答案 1 :(得分:48)

仅限PHP 5.6+

从PHP 5.6 it is possible开始,通过导入函数为函数添加别名:

use function sleep as wait;

答案 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)

自PHP 5.6起

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

class User extends SomethingWithMagicMethods {

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

}

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

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

来源: PHP: New features -> "Variadic functions via ..."

答案 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);
}