静的メソッドを使用する場合

tl; dr静的メソッドを使用しますか? はい、オブジェクトの内部状態に依存しない場合。



名前付きコンストラクターに関する投稿翻訳 )に関する議論では、静的メソッドは不適切であり、まったく使用すべきではないことが示唆されました。 私の意見では、これはあまりにも一般化されています。



静的メソッドは基本的に、グローバル関数を名前空間に整理する方法にすぎません。 名前空間を使用することは、あなたが同意すると思いますが、良い形です。 グローバル関数に関しては、常にそれらを使用します; PHP組み込み関数は、コードの基礎を形成します。



ここでの主な問題は、共有グローバルステートの欠如です。 これが以前の投稿の例です:



<?php $time = Time::from("11:45");
      
      





この例では、返される結果には副作用がなく、かなり予測可能です。 入力に指定された引数のみに依存します。 メソッドを呼び出すたびに、システム、コンテキスト、またはその他の状態に関係なく、同一の結果(値が11:45のTimeオブジェクト)が返されます。



別の例:



 <?php $sum = Calculator::sum(1, 2);
      
      





繰り返しますが、結果は予測可能です。 Calculator::sum(1, 2);



引数以外から独立したステートレスサービスを提供します。 さらに、この実装はポリモーフィックまたは異なる実装を持つことはできません。 3



以外の結果は間違いになります。 はい、数値を追加するためのアルゴリズムを改善することでメソッドの内部実装を変更できますが、これはその使用結果に影響を与えません。



今度は反対の例を見てみましょう:



 <?php Counter::increment(1); $count = Counter::getCount();
      
      





例は初歩的ですが、より複雑な状況ではそれほどわかりにくいかもしれません。 2人の開発者がコードでカウンターを使用していると想像してください。 ソリューションを単独でテストする場合、問題はありません。 しかし、ソリューションを統合した後、カウンターは別のインスタンスを使用する代わりにグローバル状態が使用されるため、期待どおりに機能しません。



抽象化



おそらく、 Calculator::sum($x, $y)



ようなコードに対する嫌悪感をまだ感じているでしょう。 模倣したり拡大したりすることはできません。 しかし、これはかなり低いレベルの抽象化であることを忘れないでください。 また、PHPで+



演算子をシミュレートおよび拡張することはできませんが、その必要性を感じたことはないと思います。 より高いレベルの抽象化が必要な場合、構成はあなたの忠実な仲間です。 ただし、 Calculator::sum($x, $y)



+



にはかなり興味深い違いがあります。最初のものは次のようになり、2番目のものはそうではありません。



 <?php $result = array_reduce([1,2,3], 'Calculator::sum', 0); // $result = 6
      
      





これらはすべて冗長に思えるかもしれませんが、関数と静的メソッドは正しく使用すれば非常に役立つため、関数と静的メソッドを忘れないでください。




パート1: PHPで名前付きコンストラクターを使用する方法



All Articles