Skip to content

Commit b0d3c4e

Browse files
「プロパティフック」の翻訳
1 parent ebb71fa commit b0d3c4e

File tree

6 files changed

+434
-201
lines changed

6 files changed

+434
-201
lines changed

language/constants.xml

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -262,7 +262,7 @@ echo ANIMALS[1]; // 出力は "cat"
262262
<sect1 xml:id="language.constants.magic">
263263
<title>マジック定数</title>
264264
<para>
265-
使われる場所によって値が変化する定数(マジック定数)が 9 つあります
265+
使われる場所によって値が変化する定数(マジック定数)がいくつかあります
266266
例えば、<constant>__LINE__</constant>はスクリプト上において
267267
使われる行によって値が変化します。
268268
これらの
@@ -315,7 +315,7 @@ echo ANIMALS[1]; // 出力は "cat"
315315
クラス名。
316316
クラス名には、そのクラスが宣言されている名前空間も含みます
317317
(例 <literal>Foo\Bar</literal>)。
318-
トレイトのメソッド内で __CLASS__ を使うと、
318+
トレイトのメソッド内で <constant>__CLASS__ </constant> を使うと、
319319
そのトレイトを use しているクラスの名前を返します。
320320
</entry>
321321
</row>
@@ -333,6 +333,14 @@ echo ANIMALS[1]; // 出力は "cat"
333333
クラスのメソッド名。
334334
</entry>
335335
</row>
336+
<row xml:id="constant.property">
337+
<entry><constant>__PROPERTY__</constant></entry>
338+
<entry>
339+
プロパティ名。
340+
<link linkend="language.oop5.property-hooks">プロパティフック</link>
341+
の内部でのみ使用可能です。
342+
</entry>
343+
</row>
336344
<row xml:id="constant.namespace">
337345
<entry><constant>__NAMESPACE__</constant></entry>
338346
<entry>

language/oop5.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929

3030
&language.oop5.basic;
3131
&language.oop5.properties;
32+
&language.oop5.property-hooks;
3233
&language.oop5.constants;
3334
&language.oop5.autoload;
3435
&language.oop5.decon;

language/oop5/abstract.xml

Lines changed: 93 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,13 @@
77
<title>クラスの抽象化</title>
88

99
<para>
10-
PHP には、抽象クラスと抽象メソッドの機能があります。
11-
abstract として定義されたクラスのインスタンスを生成することはできません。
12-
1つ以上の抽象メソッドを含む全てのクラスもまた抽象クラスとなります。
13-
abstract として定義されたメソッドは、そのメソッドのシグネチャを宣言するのみで、
14-
実装を定義することはできません。
10+
PHP には、抽象クラス、抽象メソッド、抽象プロパティがあります。
11+
abstract として定義された抽象クラスのインスタンスを生成することはできず、
12+
1つ以上の抽象メソッドや抽象プロパティを含むクラスは抽象クラスでなければいけません。
13+
abstract として定義されたメソッドは、そのメソッドのシグネチャと public または protected のアクセス権を宣言するのみで、
14+
実装を定義することはできません。抽象プロパティは、
15+
<literal>get</literal> や <literal>set</literal> の要件を宣言することができ、
16+
実装はどちらか一方に対してのみ行えます。両方同時に実装することはできません。
1517
</para>
1618

1719
<para>
@@ -21,8 +23,18 @@
2123
<link linkend="language.oop.lsp">シグネチャの互換性に関するルール</link> に従わなければいけません。
2224
</para>
2325

26+
<simpara>
27+
PHP 8.4 から、抽象クラスは public または protected の抽象プロパティを宣言できるようになりました。
28+
protected な抽象プロパティは、protected または public のスコープから読み書き可能なプロパティにより
29+
要件が満たされます。
30+
</simpara>
31+
<simpara>
32+
抽象プロパティは、通常のプロパティによって、または
33+
必要な操作に対応した <link linkend="language.oop5.property-hooks">フック</link> を定義したプロパティにより要件が満たされます。
34+
</simpara>
35+
2436
<example>
25-
<title>抽象クラスの例</title>
37+
<title>抽象メソッドの例</title>
2638
<programlisting role="php">
2739
<![CDATA[
2840
<?php
@@ -89,7 +101,7 @@ FOO_ConcreteClass2
89101
</example>
90102

91103
<example>
92-
<title>抽象クラスの例</title>
104+
<title>抽象メソッドの例</title>
93105
<programlisting role="php">
94106
<![CDATA[
95107
<?php
@@ -132,6 +144,80 @@ Mrs. Pacwoman
132144
]]>
133145
</screen>
134146
</example>
147+
<example>
148+
<title>抽象プロパティの例</title>
149+
<programlisting role="php">
150+
<![CDATA[
151+
<?php
152+
153+
abstract class A
154+
{
155+
// 継承するクラスは、public に読み取り可能なプロパティを持たなければなりません
156+
abstract public string $readable {
157+
get;
158+
}
159+
160+
// 継承するクラスは、protected または public に書き込み可能なプロパティを持たなければなりません
161+
abstract protected string $writeable {
162+
set;
163+
}
164+
165+
// 継承するクラスは、protected または public で読み書き可能なプロパティを持たなければなりません
166+
abstract protected string $both {
167+
get;
168+
set;
169+
}
170+
}
171+
172+
class C extends A
173+
{
174+
// 要件を満たし、さらに書き込みも可能にしているため有効です
175+
public string $readable;
176+
177+
// public に読み取り可能でないため、要件を満たしません
178+
protected string $readable;
179+
180+
// 要件を正確に満たしているため有効です
181+
// protected のスコープからのみ書き込みが可能です
182+
protected string $writeable {
183+
set => $value;
184+
}
185+
186+
// protected から public にアクセス権を拡張しており、問題ありません
187+
public string $both;
188+
}
189+
190+
?>
191+
]]>
192+
</programlisting>
193+
</example>
194+
<simpara>
195+
抽象プロパティにはフックを実装できます。
196+
前の例のように、<literal>get</literal> または <literal>set</literal> のどちらかを、定義せず宣言のみ行います。
197+
</simpara>
198+
<example>
199+
<title>抽象プロパティの例</title>
200+
<programlisting role="php">
201+
<![CDATA[
202+
<?php
203+
204+
abstract class A
205+
{
206+
// set のデフォルト実装(オーバーライド可能)を提供し、
207+
// 子クラスが get を実装するよう要求しています
208+
abstract public string $foo {
209+
get;
210+
211+
set {
212+
$this->foo = $value;
213+
}
214+
}
215+
}
216+
217+
?>
218+
]]>
219+
</programlisting>
220+
</example>
135221
</sect1>
136222
<!-- Keep this comment at the end of the file
137223
Local variables:

language/oop5/interfaces.xml

Lines changed: 88 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,9 @@
66
<sect1 xml:id="language.oop5.interfaces" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
77
<title>オブジェクト インターフェイス</title>
88
<para>
9-
オブジェクト インターフェイスを使うと、
10-
メソッドの実装を定義せずに、
11-
クラスが実装する必要があるメソッドを指定するコードを作成できます。
12-
インターフェイス は クラス や トレイト と名前空間を共有するので、
9+
オブジェクト インターフェースでは、クラスが実装すべきメソッドやプロパティの
10+
宣言だけを行うコードを作成できます。ここでは具体的な実装は必要ありません。
11+
インターフェイスはクラス、トレイト、列挙型と名前空間を共有するので、
1312
それらと同じ名前を使ってはいけません。
1413
</para>
1514
<para>
@@ -117,10 +116,94 @@
117116
そのインターフェイスを継承したクラスやインターフェイスから定数をオーバーライドすることができませんでした。
118117
</para>
119118
</sect2>
119+
<sect2 xml:id="language.oop5.interfaces.properties">
120+
<title>プロパティ</title>
121+
<simpara>
122+
PHP 8.4.0 から、インターフェイスはプロパティを宣言できるようになりました。
123+
宣言する場合、そのプロパティの読み取り可否、書き込み可否、あるいは双方を
124+
指定する必要があります。
125+
インターフェイスによる宣言は、public な読み書きに対してのみ適用できます。
126+
</simpara>
127+
<simpara>
128+
クラス側でインターフェイスのプロパティ要件を満たすには、
129+
public な通常のプロパティを定義する、
130+
対応するフックを実装する public な
131+
<link linkend="language.oop5.property-hooks.virtual">仮想プロパティ</link>
132+
を定義するなど、複数の方法があります。
133+
読み取り用プロパティは <literal>readonly</literal> プロパティによって満たすこともできます。
134+
ただし、インターフェイスで「書き込み可能」と宣言されているプロパティを <literal>readonly</literal> にすることはできません。
135+
</simpara>
136+
<example>
137+
<title>インターフェイスのでのプロパティ宣言の例</title>
138+
<programlisting role="php">
139+
<![CDATA[
140+
<?php
141+
interface I
142+
{
143+
// 実装クラスは、public に読み取り可能なプロパティを持つ必要があります。
144+
// public に書き込み可能かどうかは制限されません。
145+
public string $readable { get; }
146+
147+
// 実装クラスは、public に書き込み可能なプロパティを持つ必要があります。
148+
// public に読み取り可能かどうかは制限されません。
149+
public string $writeable { set; }
150+
151+
// 実装クラスは、public に読み書き可能なプロパティを持つ必要があります。
152+
public string $both { get; set; }
153+
}
154+
155+
// このクラスは、3つのプロパティをすべてフックのない通常のプロパティとして実装しています。
156+
// これは問題ありません。
157+
class C1 implements I
158+
{
159+
public string $readable;
160+
161+
public string $writeable;
162+
163+
public string $both;
164+
}
165+
166+
// このクラスは、3つのプロパティすべてを、要求されたフックのみを使って実装しています。
167+
// これも問題ありません。
168+
class C2 implements I
169+
{
170+
private string $written = '';
171+
private string $all = '';
172+
173+
// get フックのみ使い仮想プロパティを作成しています。
174+
// 「public に読み取り可能」という要件を満たします。
175+
// 書き込みはできませんが、インターフェイスからは要求されていません。
176+
public string $readable { get => strtoupper($this->writeable); }
177+
178+
// インターフェイスはこのプロパティが「書き込み可能」であることのみ要求しています。
179+
// ここに get の動作も含めることは全く問題ありません。
180+
// この例では仮想プロパティを作成しています。
181+
public string $writeable {
182+
get => $this->written;
183+
set {
184+
$this->written = $value;
185+
}
186+
}
187+
188+
// このプロパティは「public に読み書き可能」でなければならないため、
189+
// get と set の両方を実装する必要があります。
190+
// デフォルトの動作のままでも問題ありません。
191+
public string $both {
192+
get => $this->all;
193+
set {
194+
$this->all = strtoupper($value);
195+
}
196+
}
197+
}
198+
?>
199+
]]>
200+
</programlisting>
201+
</example>
202+
</sect2>
120203
<sect2 xml:id="language.oop5.interfaces.examples">
121204
&reftitle.examples;
122205
<example xml:id="language.oop5.interfaces.examples.ex1">
123-
<title>Interface の例</title>
206+
<title>インターフェイスの例</title>
124207
<programlisting role="php">
125208
<![CDATA[
126209
<?php

0 commit comments

Comments
 (0)