繁体   English   中英

如何在 PHP 中给函数取别名?

[英]How to alias a function in PHP?

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

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

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

直到 PHP 5.5

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

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

仅 PHP 5.6+

从 PHP 5.6 开始,可以通过导入函数为函数取别名:

use function sleep as wait;

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

不,但你可以这样做:

$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 配置给我们这个扩展,这意味着您的应用程序的可移植性将大大降低。

不,函数不是一等公民,因此没有像 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 不支持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 之前的任何东西,这样做也不是一个特别好的主意。 它只是使事情复杂化。

自 PHP 5.6

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

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

}

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM