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;
$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;
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;
priceがprivateだとクラスの外から参照できません。外部からのアクセスを許すにはpublicにする必要があります。
直し方: private を public にします。
パターン4
1 <?php 2 class Invoice { 3 private float $amount = 0.0; ^ 4 } 5 $inv = new Invoice(); 6 echo $inv->amount;
$amountがprivateだと、クラスの外からは読み取れません。
直し方: private を public にします。
パターン5
1 <?php 2 class Ticket { 3 private string $code = "X1"; ^ 4 } 5 $t = new Ticket(); 6 echo $t->code;
codeがprivateのままだとクラスの外から直接読めません。
直し方: private を public にします。
よくある誤解
「プロパティは宣言さえすればどこからでも読めるはず」という思い込みは誤りです。privateはクラスの外からのアクセスを言語レベルで禁止するもので、回避する手段はgetterを用意することだけです。
実務での勘所
PHPには、getterやsetterをすべて手で書く代わりに、__get($name)と__set($name, $value)というマジックメソッドを使う方法もあります。これらを定義しておくと、存在しない、あるいはアクセスできないプロパティにアクセスしようとした瞬間にPHPが自動的に呼び出してくれるため、動的にプロパティのようなインターフェースを提供できます。LaravelのEloquentモデルなど、多くのPHPフレームワークがデータベースの列を「プロパティのように」扱えるようにしているのは、この仕組みを応用したものです。