上級のPHPエラー 24問
8種類のエラーを、それぞれ複数パターンずつ収録しています。
- Cannot modify readonly property の原因と直し方readonlyを付けたプロパティは、コンストラクタの中で一度初期化した後は二度と値を変更できません。クラスの外からはもちろん、クラスの中のメソッドからの再代入も拒否されます。
- self:: で作ったインスタンスは継承先のサブクラスにならない(static:: との違い)戻り値の型を static と宣言したメソッドの中で new self() を使うと、呼び出し元がサブクラスであっても常に定義元のクラスのインスタンスが作られます。呼び出し時点のクラスを使いたい場合は new static() が必要です。
- クロージャの use($var) は値をコピーする(参照ではない)無名関数でuse($var)と書くと、その時点の$varの値がコピーされてクロージャに閉じ込められます。クロージャの中で変更しても、外側の変数には影響しません。外側の変数と連動させたい場合はuse(&$var)と参照で渡す必要があります。
- nullになりうるプロパティへのメソッド呼び出しは ?-> で守る途中のプロパティがnullかもしれないオブジェクトの連鎖に対して、通常の->でメソッドを呼ぶと致命的エラーになります。?->を使うと、途中がnullの場合は例外を投げずnullを返して処理を続けられます。
- __toString未実装のオブジェクトを文字列化した原因__toString()メソッドを持たないオブジェクトを文字列と連結したり、文字列として出力しようとしたりすると致命的エラーになります。オブジェクトを文字列として扱いたい場合は__toString()を実装する必要があります。
- 同じ名前付き引数を2回指定すると Named parameter overwrites エラーになるPHP8の名前付き引数は、同じパラメータ名を2回指定すると致命的エラーになります。位置引数と名前付き引数を混ぜて書いた際に、同じパラメータへ二重に値を渡してしまうミスで起こります。
- enumのfrom()に存在しない値を渡すと ValueError になるバックドenum(値を持つenum)のfrom()メソッドは、対応するcaseが存在しない値を渡すとValueErrorを投げます。外部からの入力値をそのままfrom()に渡す場合は、事前の検証やtryFrom()の利用が必要です。
- staticを付け忘れると、インスタンス間でプロパティが共有されないインスタンスをまたいで値を共有したい場合はstaticプロパティが必要です。staticを付け忘れると、そのプロパティは各インスタンスに独立して属するため、期待した共有ができません。