クラスに入れたい一連の独立した関数があります。それらはクラスのどのオブジェクトにも依存しないため、それらを呼び出している間、必要なすべての値が引数として渡されます。それらをすべて静的として宣言して、1つのコマンドだけで呼び出すことができるようにしてclassName::functionName(argument1,argument2,...)
も問題ありませんか、それとも通常のパブリック関数として保持し、クラスオブジェクトを介して呼び出しますか?
質問する
80 次
2 に答える
5
あなたはできます(しかし、あなたはそれをすべきではありません):
class YourClass {
public static function yourMethod( ) {
echo "method called";
}
}
YourClass::yourMethod();
それをすべきではない理由は、他のクラス/関数/他のクラスに密接に結合しているもので静的呼び出しを使用する場合ですYourClass
。したがって、単体テストを実行することや、使用されているすべてのコードを通過せずに別の方法に切り替えることは非常に困難です。また、何かを追加したことを忘れないでくださいglobal
。
あなたはまた言う:
クラスに入れたい一連の独立した関数があります。
これは私の本の大きなコード臭です。これは、あなたのクラスがSOLID プログラミングのSRP 原則に違反しているように聞こえます。
したがって、クラスをインスタンス化するだけです。
コードのテストが難しくなる理由を見てみましょう。
class SomeClassWithMethods
{
public static function doSomething()
{
}
}
class SomeClassYouWantToTest
{
public function doSomething()
{
return SomeClassWithMethods::doSomething(); // this is now tightly coupled and would be impossible to mock when unit testing it
}
}
また、それSomeClassWithMethods::doSomething
は現在グローバルに定義されています。
私たちはこれを特効薬と呼んでいます :) :
于 2012-08-09T11:30:43.677 に答える
0
はい、これは悪くありません。あなたはそれらを静的関数として定義することができ、あなたが言ったように-あなたはたった1つのステートメントでそれらを呼び出すことができます。
class Foo {
public static function bar( ) {
echo "bar called";
}
}
于 2012-08-09T11:26:46.500 に答える