2012-02-02 1 views
2

私は少しPHPモジュールを持っていたいと思います。このモジュールには、純関数であるメソッドがあります。したがって、これは単なる関数の集まりです。すべての関数は、引数を取得し、入力パラメータのみに応じて結果を返します。どのようなパターンは、PHPモジュールのために選択する?

私はいくつかの提案を持っている:PHPは、実際の静的なクラスをしていないので、私はちょうどすべての静的メソッドを持つクラスを作る

1.静的クラス

を:

class Some_Module 
{ 
    static public function sum($a, $b, $c) 
    { 
     return $a+$b+$c; 
    } 

    static public function method2($a, $b) 
    { 
     return $a-$b+5; 
    } 
} 

にですそのようなモジュールを非常に使いやすい:

$x = Some_module::sum(1,2,3); 

しかし、私は聞いたことがあります(SOにはたくさんの話題があります)、静的は悪い習慣です。

2.シングルトン

それは非常に使いやすいではありません。

// we should not to forget to get instance 
$module_instance = new Some_module; 
$x = $module_instance->sum(1,2,3); 

不便は私たちが今、このモジュールを初期化する必要があること、その事実です。 また、なぜ、シングルトンがPHPで役に立たないのか説明されているので、大量のトピックがあります。だから、それは悪い習慣でもあります。

このようなモジュールにはどのようなパターンを使用しますか?

+0

ヒーローからアドバイスを受けることは、最悪の場合です。 - あなたの例はあまりにも抽象的で、ある実装をもう一方の実装よりも推奨する。明らかに、オブジェクトにイン・アウト関数を投げ込むことはあまり意味がありません。それらは単純な関数であるべきですが、静的クラスは機能のグループ化のための許容された回避策です(これ以上のものはありません)。特に、名前空間の構文の代替手段には耐えることができない場合。 – mario

答えて

3

は、私はそれは文脈に依存し、この議論はStatic methods: are they still bad considering PHP 5.3 late static binding?

個人的にあなたの意思決定に役立つだろうと思います。その他の雑貨を保管する。ヘルパーメソッドは、グローバルとネームスペースとして使用する可能性が高いです。インスタンス化する必要のない特定のカテゴリのメソッドの限られた量を格納する際には、静的なクラスが良い選択肢かもしれません。ユニットテストの目的に気をつけてください。例えば、cool::methodのような間違ったコンテキストで静的メソッドを使用する多くのクラスは地獄になります。

// keep it abstract to prevent it from being instantiated 
abstract class Foo { 
    // cannot be altered if inherited, although limitation still exists 
    final public static function bar() { 
     echo 'test'; 
    } 
} 

Foo::bar(); 
2

シンプルなクラスを使用しますが、メソッドを静的にしないでください。確かに、それはあなたがそれをインスタンス化するために1行追加することを意味します、それは大きな問題ではありません。クラスを適切に拡張してテスト用にモックすることもできます。

関連する問題