phpUnitテストについて勉強しようと思ったら、いつの間にかstaticとは。。。を調べていたので、その覚書。
オブジェクト指向で昔に勉強したはずなのだけど、すっかり忘れていつも混乱するので。。
主にこちらのサイト様の内容を読んでのメモとなります(ありがとうございます!)。
static変数・メソッド宣言の方法
static とつけるだけでスタティックになる。
変数は以下のようにキャメル記法で記述。
public static $stPp = 0;
メソッドも同じ
public static function getNum
※横ですが、定数の場合は全て大文字のスネークケースで書きます
const NUMBER = 10;
ポイント
個人的に、一番「え〜!」とびっくりしたのは
クラスをnewしてクラス内の変数を使うとき、newしたら中の変数はインスタンスに属します。
なので、複数newでインスタンスを作ってもそれぞれが干渉することはない(はず)だけど、
static変数はインスタンスではなくクラスに属している(!)ので、newした先でstatic変数に値を代入すると、
それが他にnewしているインスタンスにも影響する。。そんなことがあるなんて!
できないこと
同じクラス内の非スタティックなプロパティへアクセスするときは
$this->プロパティ名
を使いますが、スタティックの場合これはできません。
ではどうするかというと、self::を使います。
static変数・メソッドの呼び出し方
クラス内でプロパティを呼び出すとき
self::プロパティ
self::$stPpのようにselfで呼び出します。
$this->プロパティ が使えないんですね。
クラス外からプロパティ呼び出すとき
クラス名::プロパティ
Class::$stPpのように、クラス名::で呼び出します。
クラス名で呼び出すのは、スタティックなプロパティはインスタンスではなくクラスに依存しているから。
インスタンス::プロパティでも呼び出しはできるようですが、しない方が良さそうですね。
※定数も同じで、クラス::定数名 で呼び出すます。
クラス外からメソッド呼び出すとき
クラス名::メソッド()
として呼び出します。
※スタティックメソッド内で非スタティックプロパティへのアクセスは不可
まだ全然ちゃんと理解できてないのですが、staticだから〜できないよ系のエラーにたまに遭遇するので、
ちゃんと理解してゆきたいです。
ご本家PHPのサイトで例を挙げて解説くださっているのですが、
両方合わせて読んだらなんだか混乱してきました。。