Cannot access private property の原因と直し方
privateで宣言したプロパティにクラスの外からアクセスしようとすると、致命的エラーになります。外部に公開したい値はpublicにするか、getterメソッド経由で提供する必要があります。
エラーメッセージの読み方
Fatal error: Uncaught Error: Cannot access private property Account::$balance in main.php:6
main.php- ファイル名
6- 行番号 — 実際にクラッシュした行
Error- 例外クラス — 何が起きたか。ここを検索するのが最短です
Cannot access private property Account::$balance- 内容 — どの値が問題だったか
このエラーが出る典型パターン
パターン1
1 <?php 2 class Account { 3 private float $balance = 0.0; ^ 4 } 5 $acc = new Account(); 6 echo $acc->balance;
Fatal error: Uncaught Error: Cannot access private property Account::$balance in main.php:6
$balanceがprivateだと、クラスの外からは読み取れません。外部に公開したい場合はpublicにするか、getterメソッドを用意する必要があります。
直し方: private を public にします。
広告
広告スロット(未設定)
パターン2
1 <?php 2 class User { 3 private string $email = "a@example.com"; ^ 4 } 5 $u = new User(); 6 echo $u->email;
Fatal error: Uncaught Error: Cannot access private property User::$email in main.php:6
emailがprivateのままだとクラスの外から直接読めません。publicにするか、getterを用意します。
直し方: private を public にします。
パターン3
1 <?php 2 class Product { 3 private int $price = 500; ^ 4 } 5 $p = new Product(); 6 echo $p->price;
Fatal error: Uncaught Error: Cannot access private property Product::$price in main.php:6
priceがprivateだとクラスの外から参照できません。外部からのアクセスを許すにはpublicにする必要があります。
直し方: private を public にします。
よくある誤解
「プロパティは宣言さえすればどこからでも読めるはず」という思い込みは誤りです。privateはクラスの外からのアクセスを言語レベルで禁止するもので、回避する手段はgetterを用意することだけです。
まとめ
Cannot access private propertyは中級でつまずきやすい項目です。上の3パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。