diff --git a/language/oop5/final.xml b/language/oop5/final.xml index 8d33cf0988..5152fae5dd 100644 --- a/language/oop5/final.xml +++ b/language/oop5/final.xml @@ -1,12 +1,12 @@ - + finalキーワード キーワード final - を前に付けて定義されたメソッドや定数は、子クラスから上書きできません。 + を前に付けて定義されたメソッドやプロパティ、定数は、子クラスから上書きできません。 クラス自体がfinalと定義された場合には、このクラスを拡張することはできません。 @@ -61,38 +61,55 @@ class ChildClass extends BaseClass { - - - final定数の例(PHP 8.1.0 以降) - + + finalプロパティの例(PHP 8.4.0 以降) + + +]]> + + + + final定数の例(PHP 8.1.0 以降) + ]]> - - - - - - プロパティを final として宣言することはできません。 - final として宣言できるのはクラスとメソッド、 - および定数(PHP 8.1.0以降)だけです。 - - - PHP 8.0.0 以降は、private メソッドを final として宣言できるのはコンストラクタだけになりました。 - - + + + + + + PHP 8.0.0 以降は、private メソッドを final として宣言できるのはコンストラクタだけになりました。 + + + + + private(set) として宣言されたプロパティは暗黙的にfinalになります。 + + - - + @@ -204,8 +204,13 @@ Fatal error: Uncaught Error: Typed property Shape::$numberOfSides must not be ac 読み取り専用プロパティ PHP 8.1.0 以降では、readonly - を付けてプロパティを宣言できます。 - これによって、プロパティを初期化した後に値が変更されることを防止できます。 + を付けてプロパティを宣言できます。これによって、プロパティを初期化した後に値が変更されることを防止できます。 + PHP 8.4.0より前では、readonly プロパティは暗黙的に private-set であり、 + 同じクラス内からのみ書き込みが可能でした。 + PHP 8.4.0からは、readonly プロパティは暗黙的に + protected(set) となり、 + 子クラスからも設定可能です。必要に応じて明示的に + オーバーライドすることもできます。 読み取り専用プロパティの例 diff --git a/language/oop5/visibility.xml b/language/oop5/visibility.xml index ccfe12f38a..7fc82d7bf7 100644 --- a/language/oop5/visibility.xml +++ b/language/oop5/visibility.xml @@ -1,19 +1,19 @@ - + - - アクセス権 - - プロパティ、メソッドまたは (PHP 7.1.0 以降) 定数のアクセス権 (visibility) は、 - キーワード: public, protected - または private を指定することにより定義できます。 - public 宣言されたクラスのメンバーには、どこからでもアクセス可能です。 - protected 宣言されたメンバーには、 - そのクラス自身、そのクラスを継承したクラス、および親クラスからのみアクセスできます。 - private 宣言されたメンバーには、そのメンバーを定義したクラスからのみアクセスできます。 - + + アクセス権 + + プロパティ、メソッドまたは (PHP 7.1.0 以降) 定数のアクセス権 (visibility) は、 + キーワード: public, protected + または private を指定することにより定義できます。 + public 宣言されたクラスのメンバーには、どこからでもアクセス可能です。 + protected 宣言されたメンバーには、 + そのクラス自身、そのクラスを継承したクラス、および親クラスからのみアクセスできます。 + private 宣言されたメンバーには、そのメンバーを定義したクラスからのみアクセスできます。 + プロパティのアクセス権 @@ -23,10 +23,9 @@ アクセス権を明示的に指定しない場合、 そのプロパティは public として定義されます。 - - - プロパティの宣言 - + + プロパティの宣言 + printHello(); // Public2, Protected2, Undefined を表示します ]]> - - + + 非対称可視性プロパティ + + PHP 8.4 から、プロパティは非対称に + 可視性を設定できるようになりました。 + 読み取り(get)と書き込み(set)に + 異なるスコープを設定できます。具体的には、set の可視性が + メインの可視性より広くならない限り、 + 別々に指定できます。 + + + 非対称可視性プロパティ + + - メソッドのアクセス権 - - クラスメソッドは、public, private, または protected - として定義します。アクセス権を明示せずに宣言したメソッドは、 - public となります。 - - +class SpecialBook extends Book +{ + public function update(string $author, int $year): void + { + $this->author = $author; // OK + $this->pubYear = $year; // 致命的なエラー + } +} + +$b = new Book('How to PHP', 'Peter H. Peterson', 2024); + +echo $b->title; // OK +echo $b->author; // OK +echo $b->pubYear; // 致命的なエラー + +$b->title = 'How not to PHP'; // 致命的なエラー +$b->author = 'Pedro H. Peterson'; // 致命的なエラー +$b->pubYear = 2023; // 致命的なエラー +?> +]]> + + + 非対称可視性プロパティにはいくつかの注意点があります: + + + + 型付きプロパティのみが、set の可視性を個別に指定できます。 + + + + + set の可視性は、get と同じか、 + より厳しくなければなりません。つまり、 + public protected(set) および protected protected(set) + は許可されますが、protected public(set) は構文エラーになります。 + + + + + プロパティが public の場合、メインの可視性は + 省略できます。つまり、public private(set)private(set) は + 同じ結果になります。 + + + + + private(set) の可視性を持つプロパティは + 自動的に final となり、子クラスで再宣言できません。 + + + + + プロパティへのリファレンスを取得する場合、get ではなく set の可視性に従います。 + これは、リファレンスを使用してプロパティの値を変更できるためです。 + + + + + 同様に、配列プロパティへの書き込みを試みると、内部的には get と + set の両方の操作が行われます。そのため、常により厳しい set + の可視性に従います。 + + + + + クラスが別のクラスを拡張するとき、子クラスは + final でない任意のプロパティを再定義できます。その際、 + 新しい可視性が親クラスと同じか広い場合に限り、メインの可視性または set + の可視性を広げることができます。ただし、 + private プロパティがオーバーライドされると、 + 実際には親のプロパティを変更するのではなく、 + 異なる内部名を持つ新しいプロパティを作成することに注意してください。 + + + 非対称可視性プロパティの継承 + + +]]> + + + + + + + メソッドのアクセス権 + + クラスメソッドは、public, private, または protected + として定義します。アクセス権を明示せずに宣言したメソッドは、 + public となります。 + メソッドの宣言 @@ -182,8 +299,7 @@ $myFoo->test(); // Bar::testPrivate ]]> - - + 定数のアクセス権 @@ -192,10 +308,9 @@ $myFoo->test(); // Bar::testPrivate として定義できるようになりました。 明示的に公開範囲のキーワードを明示的に宣言しない定数は、public として定義されます。 - - - PHP 7.1.0 以降での定数の宣言 - + + PHP 7.1.0 以降での定数の宣言 + foo2(); // Public, Protected では動作しますが、Private では動作しません ?> ]]> - - - + + @@ -304,7 +418,6 @@ Accessed the private method. - - + @@ -29,6 +29,11 @@ private プロパティである場合に &true;、それ以外の場合に &false; を返します。 + + + これはデフォルトの可視性のみを参照します。set の可視性は指定されていても無視されることに注意してください。 + + diff --git a/reference/reflection/reflectionproperty/isprotected.xml b/reference/reflection/reflectionproperty/isprotected.xml index 45dbee7f74..6c8ced5510 100644 --- a/reference/reflection/reflectionproperty/isprotected.xml +++ b/reference/reflection/reflectionproperty/isprotected.xml @@ -1,6 +1,6 @@ - + @@ -29,6 +29,11 @@ protected プロパティである場合に &true;、それ以外の場合に &false; を返します。 + + + これはデフォルトの可視性のみを参照します。set の可視性は指定されていても無視されることに注意してください。 + + diff --git a/reference/reflection/reflectionproperty/ispublic.xml b/reference/reflection/reflectionproperty/ispublic.xml index 5f2521c958..0b3ff69497 100644 --- a/reference/reflection/reflectionproperty/ispublic.xml +++ b/reference/reflection/reflectionproperty/ispublic.xml @@ -1,6 +1,6 @@ - + @@ -15,7 +15,7 @@ - public プロパティであるかどうかを調べます。 + プロパティが public とマークされているか調べます。 @@ -29,6 +29,11 @@ public プロパティである場合に &true;、それ以外の場合に &false; を返します。 + + + これはデフォルトの可視性のみを参照します。set の可視性は指定されていても無視されることに注意してください。 + +