1

私はクラス内に本質的に同じことをするいくつかの関数を持っています:

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です。

みんなどう思いますか?

4

2 に答える 2

2

提案したような構文は使用できません。複数の異なる関数が必要な場合は、それらすべての関数を宣言する必要があります。

それでも、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よりますが、もちろん、コードの重複量を減らすことができます。



もう1つのアイデア(メソッドでこれをどのように実行できるかわからないため、関数でデモンストレーションします)は、クロージャを使用することです。これは、PHP>=5.3を意味します。

基本的な考え方は、最初の関数があり、別の関数が返されるということです。これにより、最初の関数に渡されたパラメーターがバインドされます。

まず、他のものを作成する関数:

function creator($name) {
    return function () use ($name) {
        return $name;
    };
}

次に、その作成者の1つを使用して、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


私は無名関数とクロージャがどのように機能するかを説明するのが得意ではありませんが、グーグルで「クロージャ」を検索すると理解に役立つはずです。Javascriptのクロージャに関するチュートリアルを読むことができることに注意してください:考え方はまったく同じです。

(そして、クロージャはPHPで新しく、PHP 5.3で提供されたため、Javascriptほど多くのチュートリアルは見つかりません)

于 2010-03-26T22:51:47.347 に答える
2
public function fn_catcher($letter) {
        return __FUNCTION__.$letter;
}

public function __call($name) {
        if (substr($name, 0, 3) == 'fn_')
        {
              return $this->fn_catcher($name);
        }
}

そのように?

于 2010-03-26T22:52:10.250 に答える