4

オブジェクトをインスタンス化する必要がないため、通常は静的メソッドを使用すると思いました。そして、className::staticFunction静的メソッドを呼び出すために使用できます。今日見つかった bub:

test1.php

<?php
class Foo { 
    static public function helloWorld() {
        print "Hello world " ;
    }
}
Foo::helloWorld();

test2.php

<?php
class Foo { 
    public function helloWorld() {
        print "Hello world " ;
    }
}
Foo::helloWorld();

質問:

上記のスクリプトは両方とも機能します。関数を として宣言していませんが、引き続き関数を呼び出すためにstatic使用できます。className::staticFunctionなぜ静的メソッドを使用する必要があるのですか?

4

6 に答える 6

2

静的メソッドの「問題」は、それらが呼び出される方法です。

Foo::bar();

静的メソッドへの呼び出しはすべて、必然的にハードコーディングされており、簡単に置き換えることはできません。と比べて:

$foo->bar();

$fooここでは変数です。つまり、正確なオブジェクトと実装をbar()置き換えることができます。これは、依存性注入にとって重要であり、その基礎です。

次の場合は静的メソッドを使用します。

  • 個々のオブジェクト インスタンスを必要としない最も重要なケース
  • オブジェクトをインスタンス化する前に必要なこと
  • 代替オブジェクト コンストラクター。たとえば、DateTime::createFromFormat()代わりにnew DateTime
  • 100%確実に置き換えたり嘲笑したりする必要のないべき等効用関数

他のシナリオでも静的関数をあちこちで使用できます、これらが主なポイントです。メソッドを静的に宣言するということは、それを静的に呼び出す必要があることを意味することに注意する必要があります。つまり、呼び出し時の使用を実際に変更することはできません。この件に関する長い条約については、How Not To Kill Your Testability Using Statics を読んでください。

于 2013-08-16T07:01:46.097 に答える