https://www.php.net/manual/ja/language.oop5.basic.php
クラスをnewする際に、コンストラクタに引数を渡さない時はクラス名の後の括弧を省略する事もできます。
また、クラス名には変数を使う事もできます。
new を任意の式と一緒に使う機能がサポートされました。式は括弧で囲まなければいけません。
static でないメソッドを static メソッドとしてコールすると、 Error がスローされるようになりました。
言語リファレンス > プロパティ
https://www.php.net/manual/ja/language.oop5.basic.php
クラスのプロパティとメソッドは、それぞれ別の “名前空間” に存在するので、 同じ名前のプロパティとメソッドを共存させることもできます。
https://www.php.net/manual/ja/language.oop5.properties.php
プロパティの宣言
プロパティは、以下のフォーマットで宣言されます。
- 少なくともひとつのキーワード (たとえば アクセス権 のキーワード、 static キーワード、var キーワード)
- (オプションなのであってもなくてもよい) (callable 型以外の)型宣言 (PHP 7.4 以降)
- 通常の変数の宣言
- (あってもなくてもよい) 初期値(初期値は 定数 値であること)
アクセス権 を宣言しない場合、プロパティを public として宣言したとみなされます。
プロパティへのアクセス
クラスのメソッドからstatic でないプロパティにアクセスするには -> (オブジェクト演算子) を使って $this->property のようにします
オブジェクトに対して、存在しないプロパティを代入しようとした場合、 PHP は自動的に対応するプロパティを作成します。これを「動的なプロパティ」といいます。
動的なプロパティは、 そのインスタンスでのみ使えます。
(後のバージョンで問題が起きる事があるので、実務的には「試験範囲対象外」の内容も確認するとよいでしょう)
試験範囲対象外
読み取り専用プロパティ / クラス(PHP 8.1.0 以降、PHP 8.2.0 以降)
PHP 8.1.0 以降では、readonly を付けてプロパティを宣言できます。 これによって、プロパティを初期化した後に値が変更されることを防止できます。
readonly は、 型付きプロパティ に対してのみ指定できます。 型の制約がないプロパティを読み取り専用にしたい場合、 Mixed が使えます。 また、読み取り専用の static プロパティはサポートされていません。
読み取り専用プロパティは、一度しか初期化できません。 初期化できるのは、そのプロパティが宣言された場所と同じスコープに限られます。これらのルールから外れたプロパティへの代入や変更を行った場合、 Error 例外が発生します。
読み取り専用プロパティに対して、 明示的にデフォルト値を設定することはできません。 読み取り専用プロパティが「読み取り専用」にするのは「対象のプロパティそのもの」なので、例えば「読み取り専用のプロパティ」がインスタンス(オブジェクト)の時に、「オブジェクトを入れ替える(再代入する)」事はできませんが、「そのオブジェクトの中味」は変更する事ができます。
また、PHP 8.2.0 以降は、 クラス自体に対して readonly を指定することができます。
動的なプロパティ(PHP 8.2.0 以降)
動的なプロパティは、PHP 8.2.0 以降は推奨されなくなりました。動的なプロパティをなんの準備もなく作成しようとすると Deprecated エラーとなります。
そのため、プロパティを宣言するか、またはマジックメソッド __get()
, __set()
を実装することが推奨されます。
動的なプロパティを使うための最終手段として、アトリビュート #[\AllowDynamicProperties] でクラスをマークすることができます。また、stdClassクラスを継承すると、アトリビュートの設定がなくても Deprecated エラーが出なくなります。
このコラムに関連するコードはこちらになります
https://github.com/php-engineer-examination/php8_column_expert/blob/main/src/019.php
https://github.com/php-engineer-examination/php8_column_expert/blob/main/src/019_NotTested.php