PHPで別の名前の関数にエイリアスを付けることは可能ですか?。という名前の関数があるとしますsleep
。と呼ばれるエイリアスを作成する方法はありwait
ますか?
今では私はこのようにやっています:
function wait( $seconds ) {
sleep($seconds);
}
うん、function wait ($seconds) { sleep($seconds); }
行く方法です。ただし、sleep()のパラメーターの数を変更する必要がある場合に、wait()を変更する必要があることが心配な場合は、代わりに次のようにすることをお勧めします。
function wait() {
return call_user_func_array("sleep", func_get_args());
}
いいえ、しかしあなたはこれを行うことができます:
$wait = 'sleep';
$wait($seconds);
このようにして、arguments-number-issuesも解決します
PHP 5.3 を使用している場合は、ラムダも確認できます。
$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を構成してこの拡張機能を使用する必要があります。これは、アプリケーションの移植性が大幅に低下することを意味します。
いいえ、関数は第一級市民ではないwait = sleep
ため、たとえばJavascriptのようなものはありません。あなたは基本的にあなたがあなたの質問に入れたものをしなければなりません:
function wait ($seconds) { sleep($seconds); }
runkit 拡張機能を使用できます
http://us.php.net/manual/en/function.runkit-function-copy.php
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);
これは、長いコードがあり、それを繰り返したくない場合、またはコードが新しい関数にも役立たない場合に特に便利です。
ユーザー関数のエイリアスを作成するのに非常に役立つ、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より前の場合は、そうすることも特に良い考えではありません。それは単に問題を複雑にします。
私はこれが古いことを知っていますが、いつでもできます
$wait = 'sleep';
$wait();