PHP-同じコンテンツ、異なる名前で関数を統合できますか?
質問
クラス内には、本質的に同じことを行う機能がいくつかあります。
public function fn_a(){
return __FUNCTION__;
}
public function fn_b(){
return __FUNCTION__;
}
public function fn_c(){
return __FUNCTION__;
}
私はそれらの機能が彼らの現在の名前を維持する必要があるので、私は意図的にしました いいえ 行う:
public function fn_($letter){
return __FUNCTION__.$letter;
}
私は、コードの冗長性をここで模倣する何らかの方法を望んでいました。究極の状況は次のようなものです:
public functions fn_a, fn_b, fn_c() {
return __FUNCTION__;
}
別のソリューションは、該当する場合、クラスの「拡張」のようなことをすることかもしれません。fn_b, fn_c extend fn_a
?
みんなだと思いますか?
解決
提案したような構文は不可能です。いくつかの異なる関数が必要な場合は、それらすべての機能を宣言する必要があります。
それでも、FN_A、FN_B、FN_C機能が単純なラッパーであることが、より複雑なものである可能性がある可能性があります。
public function fn_a(){
return fn_all('a');
}
public function fn_b(){
return fn_all('b');
}
public function fn_c(){
return fn_all('c');
}
public function fn_all($name) {
// a lot of complex stuff here
}
それで、の長さに応じて fn_all
機能、もちろん、コード重複の量を減らすことができます。
別のアイデア (これが方法でどのように行われるかわからないので、私は関数でデモンストレーションします) 閉鎖を使用することです - つまり、php> = 5.3を意味します
基本的なアイデアは、最初の関数があり、別の関数を返すということです。
まず、他を作成する関数:
function creator($name) {
return function () use ($name) {
return $name;
};
}
そして、その作成者を使用して、3つの機能を取得しましょう。
$fn_a = creator('a');
$fn_b = creator('b');
$fn_c = creator('c');
そして今、これらの3つの機能を呼び出します:
echo $fn_a() . '<br />';
echo $fn_b() . '<br />';
echo $fn_c() . '<br />';
次の出力を取得します。
a
b
c
匿名の機能と閉鎖がどのように機能するかを説明するのが得意ではありませんが、Googleで「閉鎖」を検索することで理解するのに役立つはずです。 JavaScriptの閉鎖に関するチュートリアルを読むことができることに注意してください。アイデアはまったく同じです。
(そして、閉鎖がPHPで新しくなっているため、PHP 5.3で到着しました - JavaScriptほど多くのチュートリアルを見つけることはできません)
他のヒント
public function fn_catcher($letter) {
return __FUNCTION__.$letter;
}
public function __call($name) {
if (substr($name, 0, 3) == 'fn_')
{
return $this->fn_catcher($name);
}
}
そのように?