61

PHPで別の名前の関数にエイリアスを付けることは可能ですか?。という名前の関数があるとしますsleep。と呼ばれるエイリアスを作成する方法はありwaitますか?

今では私はこのようにやっています:

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

15 に答える 15

66

PHP5.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 に答える
29

いいえ、しかしあなたはこれを行うことができます:

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

このようにして、arguments-number-issuesも解決します

于 2009-11-06T16:40:04.150 に答える
22

PHP 5.3 を使用している場合は、ラムダも確認できます。

$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

私はこれが古いことを知っていますが、いつでもできます

$wait = 'sleep';
$wait();
于 2015-09-17T13:21:27.433 に答える