web-dev-qa-db-ja.com

PHPで関数をエイリアスする方法は?

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

今では次のようにしています:

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

PHP 5.6+のみ

PHP 5.6 可能です

use function sleep as wait;
49
Jon

までPHP 5.5

うん、function wait ($seconds) { sleep($seconds); }が道です。ただし、sleep()のパラメーターの数を変更する必要がある場合、wait()を変更する必要がある場合は、代わりに次の操作を実行できます。

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

いいえ、しかしこれはできます:

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

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

26

lambdas also を見ることができますPHP 5.3

$wait = function($v) { return sleep($v); };
20
Ólafur Waage

PHPの「eval」命令(多くの人が実際に問題を抱えていますが、私はそうではありません)の使用に関心がない場合は、次のようなものを使用できます。

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

いくつかのsimpleテストで使用しましたが、かなりうまくいくようです。次に例を示します。

function hello($recipient) {
    echo "Hello, $recipient\n";
}

function helloMars() {
    hello('Mars');
}

func_alias('greeting', 'hello');
func_alias('greetingMars', 'helloMars');

greeting('World');
greetingMars();
9
Nathan Crause

いいえ、PHPでこれを行う簡単な方法はありません。この言語には、ラッパー関数を作成せずに関数をエイリアスする機能はありません。

これが本当に本当に必要な場合は、 PHP拡張機能 と書いてください。拡張機能と設定PHP=この拡張機能は、アプリケーションの移植性が大幅に低下することを意味します。

6
Alan Storm

いいえ、関数は一流の市民ではないため、たとえばJavascriptのようなwait = sleepはありません。基本的にあなたはあなたの質問に入れたことをしなければなりません:

function wait ($seconds) { sleep($seconds); }
5
Greg
5
user187291
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); // -> …
4
sam

PHPがをサポートしていない場合) xを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; 
}
2
kenorb

いや。あなたが書いた方法がそれを行うための最良の方法です。

1
GSto

いいえ、そうする簡単な方法はありません-少なくともPHP v5.3の前の何かについては、そうすることは特に良い考えではありません。それは単に問題を複雑にします。

1
Alister Bulman

PHP 5.6

これは、魔法のメソッドを持つクラスで使用する場合に特に役立ちます。

class User extends SomethingWithMagicMethods {

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

}

しかし、通常の関数でも機能すると確信しています。

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

ソース: PHP:新機能-> "経由の可変機能..."

0
Nathan J.B.