古庄親方の上級試験コラム#020 言語リファレンス > オブジェクト定数

目次

クラス定数

https://www.php.net/manual/ja/language.oop5.constants.php

値が変更できない定数をクラス内、またはインターフェイスに定義することができます。
クラス定数にはアクセス権を指定する事ができます。指定しない場合のデフォルトのアクセス範囲は public です。

::class 定数を使うと、完全修飾クラス名が解決できます。 これは特に名前空間クラスに役立ちます。

コンストラクタとデストラクタ

https://www.php.net/manual/ja/language.oop5.decon.php

コンストラクタは「新たにインスタンスが生成されるタイミング」、デストラクタは「インスタンスが破棄されるタイミング」で動くマジックメソッドです。

コンストラクタの引数とプロモーション(昇格)

コンストラクタに引数がある時は、newキーワードでクラス名の括弧の後に続いて引数を指定することで値を渡す事が出来ます。 PHP 8.0.0 以降では、コンストラクタの引数を 対応するオブジェクトのプロパティに昇格させることができます。

コンストラクタのアクセス権

コンストラクタのアクセス権はpublicですが、これをprivate(やprotected)にすると、「通常のnewキーワードではインスタンスが生成できない」クラスを作成する事ができます。
「static な生成メソッド」と合わせることで、「複数の方法でのインスタンスの生成方法のサポート」や「いわゆるSingleton パターン」などを実装する事ができます。

デストラクタに引数を渡す事はできません。
デストラクタは「参照するリファレンスがひとつもなくなったとき」または「スクリプトの終了時」に呼び出されます。

継承とコンストラクタ/デストラクタ

継承先の子クラスでコンストラクタやデストラクタがある場合、暗黙のうちに「親のコンストラクタ/デストラクタを呼び出す」事はありません。
そのため、必要であれば、 parent:: の書式を使って明示的に呼び出す必要があります。

古いスタイルのコンストラクタ

PHP 8.0.0 より前のバージョンでは、「クラス名と同じ名前のメソッド」をコンストラクタと見なす、という仕様が存在しました。
PHP 8.0.0 より前のバージョンだと(警告が出るにしても)「クラス名と同じ名前のメソッド」はコンストラクタとして機能しましたが、PHP 8.0.0以降は「なんの意味も持ちません」。

デストラクタ内でのexit()

exit() でスクリプトの実行を止めた場合にもデストラクタはコールされます。 デストラクタの内部で exit() をコールすると、 それ以降のシャットダウンルーチンを実行しません。

試験範囲対象外

クラス定数(PHP 8.1.0 以降)

PHP 8.1.0 以降では、final として定義されたクラス定数は、子クラスで再定義できません。
(PHP 8.1.0未満までは、constにfinalを付ける事ができません)

初期化時の new の使用(PHP 8.1.0 以降)

PHP 8.1.0 以降では、 引数のデフォルト値の初期化時に、new を指定したオブジェクトが使えます。

このコラムに関連するコードはこちらになります
https://github.com/php-engineer-examination/php8_column_expert/blob/main/src/020.php
https://github.com/php-engineer-examination/php8_column_expert/blob/main/src/020_NotTested.php

この記事が気に入ったら
いいね または フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次