|
1 | 1 | <?xml version="1.0" encoding="utf-8"?>
|
2 | 2 | <!-- $Revision$ -->
|
3 |
| -<!-- EN-Revision: 9ee9eccf455188ab6eb352194eb6f9eb99e15606 Maintainer: seros Status: ready --> |
| 3 | +<!-- EN-Revision: d73c3dcbd6e2b085781115aa42d17b80ea285b9e Maintainer: seros Status: ready --> |
4 | 4 | <!-- Reviewed: yes Maintainer: seros -->
|
5 | 5 |
|
6 | 6 | <sect1 xml:id="language.oop5.properties" xmlns="http://docbook.org/ns/docbook">
|
@@ -64,12 +64,12 @@ hola mundo
|
64 | 64 | EOD;
|
65 | 65 | public $var3 = 1+2;
|
66 | 66 | // Declaraciones de propiedades inválidas:
|
67 |
| - public $var4 = self::miMétodoEstático(); |
| 67 | + public $var4 = self::miMetodoEstatico(); |
68 | 68 | public $var5 = $myVar;
|
69 | 69 |
|
70 | 70 | // Declaraciones de propiedades válidas:
|
71 | 71 | public $var6 = miConstante;
|
72 |
| - public $var7 = array(true, false); |
| 72 | + public $var7 = [true, false]; |
73 | 73 |
|
74 | 74 | public $var8 = <<<'EOD'
|
75 | 75 | hola mundo
|
|
83 | 83 |
|
84 | 84 | <note>
|
85 | 85 | <para>
|
86 |
| - Existen varias funciones interesantes para manipular clases y objetos. |
87 |
| - Puede ser interesante echarle un vistazo a las |
88 |
| - <link linkend="ref.classobj">Funciones de clases/objetos</link>. |
| 86 | + Existen varias funciones para manipular clases y objetos. |
| 87 | + Véase <link linkend="ref.classobj">Las funciones de clases/objetos</link>. |
89 | 88 | </para>
|
90 | 89 | </note>
|
91 | 90 |
|
92 | 91 | <sect2 xml:id="language.oop5.properties.typed-properties">
|
93 | 92 | <title>Declaraciones de tipo</title>
|
94 | 93 | <para>
|
95 |
| - A partir de PHP 7.4.0, las definiciones de propiedades pueden incluir un |
| 94 | + A partir de PHP 7.4.0, las definiciones de propiedades pueden incluirse |
96 | 95 | <xref linkend="language.types.declarations" />,
|
97 | 96 | con la excepción de los <type>callable</type>.
|
98 | 97 | <example>
|
@@ -193,6 +192,143 @@ Fatal error: Uncaught Error: Typed property Shape::$numberOfSides must not be ac
|
193 | 192 | </para>
|
194 | 193 | </sect2>
|
195 | 194 |
|
| 195 | + <sect2 xml:id="language.oop5.properties.readonly-properties"> |
| 196 | + <title>Propiedad Readonly</title> |
| 197 | + <para> |
| 198 | + A partir de PHP 8.1.0, una propiedad se puede declarar con el modificador <code>readonly</code> (de solo lectura), lo que impide la modificación de la propiedad después de la inicialización. |
| 199 | + <example> |
| 200 | + <title>Ejemplo de propiedades de solo lectura</title> |
| 201 | + <programlisting role="php"> |
| 202 | +<![CDATA[ |
| 203 | +<?php |
| 204 | +
|
| 205 | +class Test { |
| 206 | + public readonly string $prop; |
| 207 | +
|
| 208 | + public function __construct(string $prop) { |
| 209 | + // Inicialización. |
| 210 | + $this->prop = $prop; |
| 211 | + } |
| 212 | +} |
| 213 | +
|
| 214 | +$test = new Test("foobar"); |
| 215 | +// Lectura. |
| 216 | +var_dump($test->prop); // string(6) "foobar" |
| 217 | +
|
| 218 | +// Reasignación ilegal. No importa que el valor asignado sea el mismo. |
| 219 | +$test->prop = "foobar"; |
| 220 | +// Error: Cannot modify readonly property Test::$prop |
| 221 | +?> |
| 222 | +]]> |
| 223 | + </programlisting> |
| 224 | + </example> |
| 225 | + <note> |
| 226 | + <para> |
| 227 | + El modificador readonly solo se puede aplicar a las <link linkend="language.oop5.properties.typed-properties">propiedades tipadas</link>. |
| 228 | + Se puede crear una propiedad readonly sin restricciones mediante el tipo <xref linkend="language.types.declarations.mixed" />. |
| 229 | + </para> |
| 230 | + </note> |
| 231 | + <note> |
| 232 | + <para> |
| 233 | + El modificador readonly no son compatibles en propiedades estáticas. |
| 234 | + </para> |
| 235 | + </note> |
| 236 | + </para> |
| 237 | + <para> |
| 238 | + Una propiedad readonly solo se puede inicializar una vez, y solo desde el ámbito en el que se ha declarado. Cualquier otra asignación o modificación de la propiedad dará lugar a una excepción de <classname>Error</classname>. |
| 239 | + <example> |
| 240 | + <title>Inicialización ilegal de propiedades readonly</title> |
| 241 | + <programlisting role="php"> |
| 242 | +<![CDATA[ |
| 243 | +<?php |
| 244 | +class Test1 { |
| 245 | + public readonly string $prop; |
| 246 | +} |
| 247 | +
|
| 248 | +$test1 = new Test1; |
| 249 | +// Inicialización ilegal fuera del ámbito privado. |
| 250 | +$test1->prop = "foobar"; |
| 251 | +// Error: Cannot initialize readonly property Test1::$prop from global scope |
| 252 | +?> |
| 253 | +]]> |
| 254 | + </programlisting> |
| 255 | + </example> |
| 256 | + </para> |
| 257 | + <note> |
| 258 | + <para> |
| 259 | + No se permite especificar un valor predeterminado explícito en las propiedades readonly, porque una propiedad readonly con un valor predeterminado es esencialmente la misma que una constante y, por lo tanto, no es particularmente útil. |
| 260 | + <example> |
| 261 | + <programlisting role="php"> |
| 262 | +<![CDATA[ |
| 263 | +<?php |
| 264 | +
|
| 265 | +class Test { |
| 266 | + // Fatal error: Readonly property Test::$prop cannot have default value |
| 267 | + public readonly int $prop = 42; |
| 268 | +} |
| 269 | +?> |
| 270 | +]]> |
| 271 | + </programlisting> |
| 272 | + </example> |
| 273 | + </para> |
| 274 | + </note> |
| 275 | + <note> |
| 276 | + <para> |
| 277 | + Las propiedades readonly no pueden usarse con la función <function>unset</function> una vez inicializadas. Sin embargo, es posible desactivar una propiedad readonly antes de la inicialización, desde el ámbito donde se ha declarado la propiedad. |
| 278 | + </para> |
| 279 | + </note> |
| 280 | + <para> |
| 281 | + Las modificaciones no son necesariamente asignaciones simples, todo lo siguiente también dará lugar a una excepción <classname>Error</classname>: |
| 282 | + <example> |
| 283 | + <programlisting role="php"> |
| 284 | +<![CDATA[ |
| 285 | +<?php |
| 286 | +
|
| 287 | +class Test { |
| 288 | + public function __construct( |
| 289 | + public readonly int $i = 0, |
| 290 | + public readonly array $ary = [], |
| 291 | + ) {} |
| 292 | +} |
| 293 | +
|
| 294 | +$test = new Test; |
| 295 | +$test->i += 1; |
| 296 | +$test->i++; |
| 297 | +++$test->i; |
| 298 | +$test->ary[] = 1; |
| 299 | +$test->ary[0][] = 1; |
| 300 | +$ref =& $test->i; |
| 301 | +$test->i =& $ref; |
| 302 | +byRef($test->i); |
| 303 | +foreach ($test as &$prop); |
| 304 | +?> |
| 305 | +]]> |
| 306 | + </programlisting> |
| 307 | + </example> |
| 308 | + </para> |
| 309 | + <para> |
| 310 | + Sin embargo, las propiedades readonly no excluyen la mutabilidad interior. Los objetos (o recursos) almacenados en propiedades readonly aún pueden modificarse internamente: |
| 311 | + <example> |
| 312 | + <programlisting role="php"> |
| 313 | +<![CDATA[ |
| 314 | +<?php |
| 315 | +
|
| 316 | +class Test { |
| 317 | + public function __construct(public readonly object $obj) {} |
| 318 | +} |
| 319 | +
|
| 320 | +$test = new Test(new stdClass); |
| 321 | +// Mutación interior. |
| 322 | +$test->obj->foo = 1; |
| 323 | +// Reasignación ilegal. |
| 324 | +$test->obj = new stdClass; |
| 325 | +?> |
| 326 | +]]> |
| 327 | + </programlisting> |
| 328 | + </example> |
| 329 | + </para> |
| 330 | + </sect2> |
| 331 | + |
196 | 332 | </sect1>
|
197 | 333 |
|
198 | 334 | <!-- Keep this comment at the end of the file
|
|
0 commit comments