①クラス名::関数()
という呼び出し方と、
②$object = new class
$return = $object->関数();
という呼び出し方と二通りありますが、
「①の方法だといろいろと制限がある」
ということを聞きました。
どのような制限があるのか、教えてください。
http://sjc-p.obx21.com/word/jk/classmethod.html
URLはJavaの説明ですが、概念的にはPHPでも同じです。
>①クラス名::関数()
これはクラスメソッドの呼び出しです。
呼び出し側ではインスタンスを生成しなくてもコールできますが、その代わりクラスメソッドの定義の中では $this などのインスタンス関連の変数等が使えません。
("paranet::" などのクラス修飾子は使えます)
http://e-words.jp/w/E382A4E383B3E382B9E382BFE383B3E382B9.html
インスタンスについて
http://fol.axisz.jp/php/pgstatic%82%C8%83%81%83%93%83o.html
staticメンバについて
クラス内のstatic属性の変数はクラス共通の変数となります。
同じくstatic属性の関数もクラス共通の関数になります。
staticな関数とそうでない関数の違いは、引数にあります。
たとえばclassにstaticなメンバ関数「a_func(a,b)」と、そうでないメンバ関数「b_func(a,b)」があったとして、以下のソースを実行した場合・・・
$object = new class;
$object->a_func(1,2);
$object->b_func(1,2);
↓内部的には・・・
$object = new class;
class::a_func(1,2);
class::b_func($object,1,2);
と、勝手に$objectの内容が送られているはずで、これは$thisとして受け取れます。(PHPでの実装はしりませんが概念はC++と同じ)
つまり、インスタンス(メモリ領域)を保たないa_funcはインスタンス中の変数を見たり変更したり出来ないというわけです。a_funcからは$thisも見れないはずです。
ただし例外があって、先にでたstatic属性の変数は同じくインスタンスを保たず、クラスの枠に収められてはいるけど、実体はグローバル変数。インスタンスがあろうが無かろうが常にメモリが確保されているので、b_funcからも参照できます。
制限の説明というより概念の話になってしまいましたが・・・。
this などのインスタンス関連の変数等・・の
「等」の部分が知りたいです。宜しくお願いします