1
1
<?xml version =" 1.0" encoding =" utf-8" ?>
2
2
<!-- $Revision$ -->
3
- <!-- EN-Revision: fc174e8d6162091550edde46159917ee7e5a2e73 Maintainer: hirokawa Status: ready -->
4
- <!-- CREDITS: shimooka -->
3
+ <!-- EN-Revision: 922b4b5aeb327d78ea1bb4b932e5db2e9a03ffc5 Maintainer: mumumu Status: ready -->
5
4
<sect1 xml : id =" language.oop5.constants" xmlns =" http://docbook.org/ns/docbook" >
6
5
<title >クラス定数</title >
7
6
<para >
8
- 値が変更できない <link linkend =" language.constants" >定数</link > をクラス内に定義することができます。
9
- クラス定数のデフォルトのアクセス範囲は <literal >public</literal > です。
10
- </para >
7
+ 値が変更できない <link linkend =" language.constants" >定数</link > をクラス内に定義することができます。
8
+ クラス定数のデフォルトのアクセス範囲は <literal >public</literal > です。
9
+ </para >
11
10
<note >
12
11
<para >
13
12
クラス定数は、子クラスで再定義することもできます。
16
15
</para >
17
16
</note >
18
17
<para >
19
- インターフェイスに定数を持たせることもできます。
20
- <link linkend =" language.oop5.interfaces" >インターフェイスについてのドキュメント</link >
21
- で例を御覧ください。
22
- </para >
23
- <para >
24
- 変数を用いてクラスを参照することも可能です。
25
- 変数の値に (<literal >self</literal > や <literal >parent</literal >、
26
- <literal >static</literal > といった)
27
- キーワードを指定することはできません。
28
- </para >
18
+ インターフェイスに定数を持たせることもできます。
19
+ <link linkend =" language.oop5.interfaces" >インターフェイスについてのドキュメント</link >
20
+ で例を御覧ください。
21
+ </para >
22
+ <para >
23
+ 変数を用いてクラスを参照することも可能です。
24
+ 変数の値に (<literal >self</literal > や <literal >parent</literal >、
25
+ <literal >static</literal > といった)
26
+ キーワードを指定することはできません。
27
+ </para >
29
28
<para >
30
29
クラス定数はクラス単位で割り当てられるものです。インスタンス単位ではないことに注意しましょう。
31
30
</para >
32
- <example >
31
+ <para >
32
+ PHP 8.3.0 以降では、クラス定数は <literal >bool</literal >,
33
+ <literal >int</literal >, <literal >float</literal >, <literal >string</literal >, <literal >array</literal > のようなスカラー型を持つことができます。
34
+ <literal >array</literal > を使う場合、その内容は他のスカラー型に限ります。
35
+ </para >
36
+ <example >
33
37
<title >定数の定義と使用</title >
34
- <programlisting role =" php" >
38
+ <programlisting role =" php" >
35
39
<![CDATA[
36
40
<?php
37
41
class MyClass
@@ -56,7 +60,6 @@ echo $class::CONSTANT."\n";
56
60
]]>
57
61
</programlisting >
58
62
</example >
59
-
60
63
<para >
61
64
特別な <constant >::class</constant > 定数を使うと、
62
65
コンパイル時の完全修飾クラス名が解決できます。
@@ -77,13 +80,13 @@ namespace foo {
77
80
]]>
78
81
</programlisting >
79
82
</example >
83
+
80
84
<example >
81
85
<title >クラス内での定数式の例</title >
82
86
<programlisting role =" php" >
83
87
<![CDATA[
84
88
<?php
85
89
const ONE = 1;
86
-
87
90
class foo {
88
91
const TWO = ONE * 2;
89
92
const THREE = ONE + self::TWO;
@@ -122,6 +125,101 @@ Fatal error: Uncaught Error: Cannot access private const Foo::BAZ in …
122
125
PHP 7.1.0 以降は、クラス定数のアクセス範囲を指定できるようになりました。
123
126
</para >
124
127
</note >
128
+ <example >
129
+ <title >PHP 8.3.0 以降で行われる、クラス定数のアクセス権の関係チェック</title >
130
+ <programlisting role =" php" >
131
+ <![CDATA[
132
+ <?php
133
+
134
+ interface MyInterface
135
+ {
136
+ public const VALUE = 42;
137
+ }
138
+
139
+ class MyClass implements MyInterface
140
+ {
141
+ protected const VALUE = 42;
142
+ }
143
+ ?>
144
+ ]]>
145
+ </programlisting >
146
+ &example.outputs.83;
147
+ <screen >
148
+ <![CDATA[
149
+ Fatal error: Access level to MyClass::VALUE must be public (as in interface MyInterface) …
150
+ ]]>
151
+ </screen >
152
+ </example >
153
+ <note >
154
+ <simpara >
155
+ PHP 8.3.0 以降では、アクセス権の関係がより厳密にチェックされるようになりました。
156
+ これより前のバージョンでは、
157
+ クラス定数のアクセス権は、インターフェイスを実装した側の定数のそれと異なっていても問題ありませんでした。
158
+ </simpara >
159
+ </note >
160
+ <example >
161
+ <title >PHP 8.3.0 以降で有効な、クラス定数を取得する文法</title >
162
+ <programlisting role =" php" >
163
+ <![CDATA[
164
+ <?php
165
+ class Foo {
166
+ public const BAR = 'bar';
167
+ private const BAZ = 'baz';
168
+ }
169
+
170
+ $name = 'BAR';
171
+ echo Foo::{$name}, PHP_EOL; // bar
172
+ ?>
173
+ ]]>
174
+ </programlisting >
175
+ </example >
176
+ <note >
177
+ <para >
178
+ PHP 8.3.0 以降では、クラス定数は変数を使って動的に取得できます。
179
+ </para >
180
+ </note >
181
+ <example >
182
+ <title >PHP 8.3.0 以降で有効な、クラス定数の型付け</title >
183
+ <programlisting role =" php" >
184
+ <![CDATA[
185
+ <?php
186
+
187
+ class MyClass {
188
+ public const bool MY_BOOL = true;
189
+ public const int MY_INT = 1;
190
+ public const float MY_FLOAT = 1.01;
191
+ public const string MY_STRING = 'one';
192
+ public const array MY_ARRAY = [self::MY_BOOL, self::MY_INT, self::MY_FLOAT, self::MY_STRING];
193
+ }
194
+
195
+ var_dump(MyClass::MY_BOOL);
196
+ var_dump(MyClass::MY_INT);
197
+ var_dump(MyClass::MY_FLOAT);
198
+ var_dump(MyClass::MY_STRING);
199
+ var_dump(MyClass::MY_ARRAY);
200
+ ?>
201
+ ]]>
202
+ </programlisting >
203
+ &example.outputs.83;
204
+ <screen >
205
+ <![CDATA[
206
+ bool(true)
207
+ int(1)
208
+ float(1.01)
209
+ string(3) "one"
210
+ array(4) {
211
+ [0]=>
212
+ bool(true)
213
+ [1]=>
214
+ int(1)
215
+ [2]=>
216
+ float(1.01)
217
+ [3]=>
218
+ string(3) "one"
219
+ }
220
+ ]]>
221
+ </screen >
222
+ </example >
125
223
</sect1 >
126
224
<!-- Keep this comment at the end of the file
127
225
Local variables:
0 commit comments