削除された内容 追加された内容
→‎クラス: PHPではコンストラクタ名が "__construct" に決まっています。これ以外のものに名前を変えるとエラーになります。
→‎クラス: PHP公式サイトでは言及されていないですが、C#が同様にコンストラクタを仲介して readonly なクラス変数との値のやりとりをする仕組みです。
336 行
 
<code>int</code> や <code>?string </code> は型名です。最近のPHPでは、クラスの変数の宣言の際、型をつけられます。詳しくは公式マニュアルなどをお読みください。
 
==== readonly プロパティ ====
readonly プロパティを用いると、クラスのインスタンス作成時に一度しか変数を代入できなくなります。このため、宣言後に書き換えされたくないクラス変数のある場合、役立ちます。
 
下記コードは、公式サイトにあるコードをもとに、wiki用に、意図的にエラーになる行をコメントアウトしたものです。(エラー行はコメントアウトしてあるので、実行すると成功する。)
 
<syntaxhighlight lang="PHP">
<?php
 
class Test {
public readonly string $prop;
 
public function __construct(string $prop) {
// 正しい初期化
$this->prop = $prop;
}
}
 
$test = new Test("foobar");
// 正しいプロパティの読み取り
var_dump($test->prop); // string(6) "foobar"
 
// 不正な再代入です。同じ値を代入することは問題ありません。
// $test->prop = "foobar"; // wiki用にコメントアウト
// Error: Cannot modify readonly property Test::$prop
?>
 
</syntaxhighlight>
 
実行結果
<pre>
string(6) "foobar"
 
</pre>
 
readonly は、必ずコンストラクタを仲介して、readonly なクラス変数と呼出側の値のやりとりをしなければなりません。
 
公式サイトを見ても特に明言はされてないですが、しかしそうしないとエラーになります。
 
また、PHP公式サイトでは言及されていないですが、C#が同様にコンストラクタを仲介して readonly なクラス変数との値のやりとりをする仕組みです。
 
コンストラクタを仲介せずにもっと気軽に使いたいかもしれませんが、無理か、仮にどうにか実行が出来たとしても非推奨でしょう。
 
 
[[Category:PHP|*]]