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も解決します
lambdas also を見ることができます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); }");
}
いくつかのsimpleテストで使用しましたが、かなりうまくいくようです。次に例を示します。
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); }
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がをサポートしていない場合) xを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の前の何かについては、そうすることは特に良い考えではありません。それは単に問題を複雑にします。
これは、魔法のメソッドを持つクラスで使用する場合に特に役立ちます。
class User extends SomethingWithMagicMethods {
public function Listings(...$args) {
return $this->Children(...$args);
}
}
しかし、通常の関数でも機能すると確信しています。
function UserListings(...$args) {
return UserChildren(...$args);
}