Repository navigation
Expand file tree
/
Copy pathconstants.xml
More file actions
248 lines (233 loc) · 5.83 KB
/
Copy pathconstants.xml
File metadata and controls
248 lines (233 loc) · 5.83 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: dff848b17dafaabfb7662ffb5fecfcb04e3b771d Maintainer: PhilDaiguille Status: ready -->
<sect1 xml:id="language.oop5.constants" xmlns="http://docbook.org/ns/docbook">
<title>Constantes de clase</title>
<simpara>
Es posible definir <link linkend="language.constants">constantes</link>
por clases que permanecen idénticas y no modificables.
La visibilidad por omisión de las constantes de clase es <literal>public</literal>.
</simpara>
<note>
<para>
Las constantes de clases pueden ser redefinidas por una clase hija.
A partir de PHP 8.1.0, las constantes de clases no pueden ser
redefinidas por una clase hija si ha sido definida como
<link linkend="language.oop5.final">final</link>.
</para>
</note>
<para>
También es posible para las interfaces tener constantes.
Ver la <link linkend="language.oop5.interfaces">documentación de las interfaces</link>
para ejemplos.
</para>
<para>
Es posible referenciar la clase utilizando una variable.
El valor de la variable no puede ser una palabra clave (por ejemplo, <literal>self</literal>,
<literal>parent</literal> y <literal>static</literal>).
</para>
<para>
Tenga en cuenta que las constantes de clase son asignadas una vez por clase, y no
para cada instancia de clase.
</para>
<para>
A partir de PHP 8.3.0, las constantes de clase pueden tener un tipo escalar como
<literal>bool</literal>, <literal>int</literal>, <literal>float</literal>, <literal>string</literal>,
o incluso <literal>array</literal>. Al utilizar <literal>array</literal>, su contenido
solo puede contener otros tipos escalares.
</para>
<example>
<title>Definición y uso de una constante de clase</title>
<programlisting role="php">
<![CDATA[
<?php
class MyClass
{
const CONSTANT = 'valor constante';
function showConstant() {
echo self::CONSTANT . "\n";
}
}
echo MyClass::CONSTANT . "\n";
$classname = "MyClass";
echo $classname::CONSTANT . "\n";
$class = new MyClass();
$class->showConstant();
echo $class::CONSTANT."\n";
?>
]]>
</programlisting>
</example>
<para>
La constante especial <constant>::class</constant> permite
una resolución de nombre de clase completamente cualificado en el momento de la compilación,
esto es útil para las clases en un espacio de nombres:
</para>
<example>
<title>Ejemplo de uso de ::class</title>
<programlisting role="php">
<![CDATA[
<?php
namespace foo {
class bar {
}
echo bar::class; // foo\bar
}
?>
]]>
</programlisting>
</example>
<example>
<title>Ejemplo de expresiones para una constante de clase</title>
<programlisting role="php">
<![CDATA[
<?php
const ONE = 1;
class foo {
const TWO = ONE * 2;
const THREE = ONE + self::TWO;
const SENTENCE = 'El valor de THREE es '.self::THREE;
}
?>
]]>
</programlisting>
</example>
<example>
<title>Modificador de visibilidad de las constantes de clase, a partir de PHP 7.1</title>
<programlisting role="php">
<![CDATA[
<?php
class Foo {
public const BAR = 'bar';
private const BAZ = 'baz';
}
echo Foo::BAR, PHP_EOL;
echo Foo::BAZ, PHP_EOL;
?>
]]>
</programlisting>
&example.outputs.71;
<screen>
<![CDATA[
bar
Fatal error: Uncaught Error: Cannot access private const Foo::BAZ in …
]]>
</screen>
</example>
<note>
<para>
A partir de PHP 7.1.0, los modificadores de visibilidad son permitidos
en las constantes de clase.
</para>
</note>
<example>
<title>Verificación de varianza de visibilidad de las constantes de clase, a partir de PHP 8.3.0</title>
<programlisting role="php">
<![CDATA[
<?php
interface MyInterface
{
public const VALUE = 42;
}
class MyClass implements MyInterface
{
protected const VALUE = 42;
}
?>
]]>
</programlisting>
&example.outputs.83;
<screen>
<![CDATA[
Fatal error: Access level to MyClass::VALUE must be public (as in interface MyInterface) …
]]>
</screen>
</example>
<note>
<simpara>
A partir de PHP 8.3.0, la varianza de visibilidad es verificada de manera más estricta.
Antes de esta versión, la visibilidad de una constante de clase podía diferir de la de la constante
en la interfaz implementada.
</simpara>
</note>
<example>
<title>Sintaxis de acceso dinámico a las constantes de clase, a partir de PHP 8.3.0</title>
<programlisting role="php">
<![CDATA[
<?php
class Foo {
public const BAR = 'bar';
private const BAZ = 'baz';
}
$name = 'BAR';
echo Foo::{$name}, PHP_EOL; // bar
?>
]]>
</programlisting>
</example>
<note>
<para>
A partir de PHP 8.3.0, las constantes de clase pueden ser recuperadas dinámicamente utilizando una
variable.
</para>
</note>
<example>
<title>Asignación de tipos a las constantes de clase, a partir de PHP 8.3.0</title>
<programlisting role="php">
<![CDATA[
<?php
class MyClass {
public const bool MY_BOOL = true;
public const int MY_INT = 1;
public const float MY_FLOAT = 1.01;
public const string MY_STRING = 'one';
public const array MY_ARRAY = [self::MY_BOOL, self::MY_INT, self::MY_FLOAT, self::MY_STRING];
}
var_dump(MyClass::MY_BOOL);
var_dump(MyClass::MY_INT);
var_dump(MyClass::MY_FLOAT);
var_dump(MyClass::MY_STRING);
var_dump(MyClass::MY_ARRAY);
?>
]]>
</programlisting>
&example.outputs.83;
<screen>
<![CDATA[
bool(true)
int(1)
float(1.01)
string(3) "one"
array(4) {
[0]=>
bool(true)
[1]=>
int(1)
[2]=>
float(1.01)
[3]=>
string(3) "one"
}
]]>
</screen>
</example>
</sect1>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->