Code Fix

中級

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メソッドを用意する必要があります。

直し方: privatepublic にします。

この問題を解いてみる →

広告
広告スロット(未設定)

パターン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を用意します。

直し方: privatepublic にします。

この問題を解いてみる →

パターン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にする必要があります。

直し方: privatepublic にします。

この問題を解いてみる →

よくある誤解

「プロパティは宣言さえすればどこからでも読めるはず」という思い込みは誤りです。privateはクラスの外からのアクセスを言語レベルで禁止するもので、回避する手段はgetterを用意することだけです。

まとめ

Cannot access private propertyは中級でつまずきやすい項目です。上の3パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。

演習をはじめる

関連するエラー

広告
広告スロット(未設定)