PHP5.3から遅延静的束縛(Late Static Bindings)が使えるようになり、

static::を使うことで静的メソッドが使いやすくなると思います。

それを踏まえた上で下記以外で静的メソッドを使うメリット・デメリット、
また気をつけておきたいことがありましたら教えて下さい。

◎メリット:
インスタンスを作成するよりパフォーマンスがよくなる(はず)
インスタンス作成の手間がいらない

◎デメリット:
->(アロー演算子)が使えない

なお、今回はPHP5.3以降の話でお願いします。
よろしくお願いします。

※URLのみの回答はご遠慮ください

回答の条件
  • 1人2回まで
  • 登録:2009/04/30 23:50:34
  • 終了:2009/05/07 23:55:12

回答(1件)

id:rryu No.1

りゅう回答回数30ベストアンサー獲得回数22009/05/03 14:49:39

ポイント60pt

パフォーマンス面のメリットは無いと考えるべきです。

静的メソッドの呼び出しが早いとされる理由は、メソッドを見つけるためにクラスの継承チェーンを辿っていく必要が無いからですが、遅延静的束縛ではそれが必要になるので、結局インスタンスメソッドの呼び出しと同程度のコストになります。確かにインスタンスを生成しなくても使えますが、それで事足りるのはシングルトンパターンな場合だけなので、たとえインスタンスを生成したとしてもたかだか1回です。この1回が省略できたことでパフォーマンスが大きく変わることはないでしょう。


遅延静的束縛の利点は、静的メソッドをサブクラスで再定義(オーバーライド)できることです。

遅延束縛でない静的メソッドは、クラスという名前空間にある単なる関数でしたが、遅延束縛により普通のメソッドとして利用できるようになったという訳です。これによりPerlやRubyのO/Rマッパでよく使われる、クラスをシングルトンオブジェクトとして活用するというパターンがやりやすくなります。


デメリットというか、罠としては静的フィールドはオーバーライドできないというものがあります。親クラスのフィールドを子クラスで再定義しても、フィールドの実体は親クラスにあるものが使われるため、静的フィールドは親クラスおよび兄弟クラス間で共有する状態になります。子クラスでフィールドの内容を変更したはずなのになぜか親クラスでも変わっていたという事が起ります。


というように、静的フィールドの扱いの面倒さと、シングルトンパターンでしか活用できないという応用範囲の狭さがあるので、積極的に活用するものでもないと思います。

id:xxmasaxx

詳しい説明有り難うございます。とても参考になりました。

自分でも色々試してみましたが、確かに使うのには制約があって面倒ですね。

回答どうも有り難うございました。

2009/05/03 18:03:51

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません