staticを付け忘れると、インスタンス間でプロパティが共有されない
インスタンスをまたいで値を共有したい場合はstaticプロパティが必要です。staticを付け忘れると、そのプロパティは各インスタンスに独立して属するため、期待した共有ができません。
エラーメッセージの読み方
Fatal error: Uncaught Error: Access to undeclared static property Counter::$count in main.php:5
main.php- ファイル名
5- 行番号 — 実際にクラッシュした行
Error- 例外クラス — 何が起きたか。ここを検索するのが最短です
Access to undeclared static property Counter::$count- 内容 — どの値が問題だったか
このエラーが出る典型パターン
パターン1
1 <?php 2 class Counter { 3 public int $count = 0; ^ 4 public function increment() { 5 self::$count++; 6 } 7 } 8 $a = new Counter(); 9 $b = new Counter(); 10 $a->increment(); 11 $a->increment(); 12 $b->increment(); 13 echo Counter::$count;
Fatal error: Uncaught Error: Access to undeclared static property Counter::$count in main.php:5
staticを付けずに宣言すると$countはインスタンスごとの通常のプロパティになります。それをself::$countという静的な書き方でアクセスしようとすると、静的プロパティとして宣言されていないため致命的エラーになります。
直し方: (空) を static にします。
広告
広告スロット(未設定)
パターン2
1 <?php 2 class Registry { 3 public int $total = 0; ^ 4 public function add($n) { 5 self::$total += $n; 6 } 7 } 8 $a = new Registry(); 9 $b = new Registry(); 10 $a->add(10); 11 $b->add(5); 12 echo Registry::$total;
Fatal error: Uncaught Error: Access to undeclared static property Registry::$total in main.php:5
staticの無い$totalをself::$totalとして扱おうとすると、静的プロパティが宣言されていないため致命的エラーになります。全インスタンスで共有したい値にはstaticが必要です。
直し方: (空) を static にします。
パターン3
1 <?php 2 class Logger { 3 public int $entries = 0; ^ 4 public function log() { 5 self::$entries++; 6 } 7 } 8 $a = new Logger(); 9 $b = new Logger(); 10 $a->log(); 11 $b->log(); 12 $b->log(); 13 echo Logger::$entries;
Fatal error: Uncaught Error: Access to undeclared static property Logger::$entries in main.php:5
$entriesにstaticが無いままself::$entriesとしてアクセスすると、静的プロパティとして宣言されていないため致命的エラーになります。
直し方: (空) を static にします。
よくある誤解
「クラスに書いたプロパティはクラス全体で1つのはず」という思い込みは誤りです。staticを付けない限り、プロパティはnewするたびに新しく作られる、インスタンスごとに独立した値になります。
まとめ
staticを付け忘れると、インスタンス間でプロパティが共有されないは上級でつまずきやすい項目です。上の3パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。