Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 14 additions & 6 deletions language/oop5/properties.xml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: 4e77868e15fea65175b87a38d6d31b61d63f7f8e Maintainer: PhilDaiguille Status: ready -->
<!-- EN-Revision: 822b0828562580aac0327eb2d84e8e6e06e51a98 Maintainer: PhilDaiguille Status: ready -->
<sect1 xml:id="language.oop5.properties" xmlns="http://docbook.org/ns/docbook">
<title>Propiedades</title>

Expand All @@ -16,7 +16,7 @@
a partir de PHP 7.4, de una declaración de tipo,
seguida de una declaración clásica de variable.
Esta declaración puede incluir una inicialización, pero esta debe
ser un valor <link linkend="language.constants">constante</link>
ser un valor <link linkend="language.constants">constante</link>.
</para>
<note>
<simpara>
Expand Down Expand Up @@ -420,16 +420,24 @@ var_dump($test2->prop); // NULL
Esta propiedad creada dinámicamente estará <emphasis>únicamente</emphasis>
disponible en esta instancia de clase.
</para>

<simpara>
Las propiedades dinámicas son compatibles con
<link linkend="stdclass.intro">stdClass</link> y sus subclases. Otras clases
pueden habilitar un comportamiento similar con
<link linkend="allowdynamicproperties.intro">AllowDynamicProperties</link> o
la <link linkend="language.oop5.overloading">sobrecarga de propiedades</link>.
</simpara>
<warning>
<simpara>
Las propiedades dinámicas están obsoletas a partir de PHP 8.2.0.
Crear una propiedad dinámica está deprecado a partir de PHP 8.2.0,
a menos que la clase esté marcada con el atributo
<code>#[\AllowDynamicProperties]</code>.
Se recomienda declarar la propiedad en su lugar.
Para manejar nombres de propiedades arbitrarios, la clase debería implementar
los métodos mágicos <link linkend="object.get">__get()</link> y
<link linkend="object.set">__set()</link>.
Como último recurso, la clase puede ser marcada con el atributo
<code>#[\AllowDynamicProperties]</code>.
Marcar la clase con el atributo sigue siendo una opción, pero
generalmente se considera un último recurso.
</simpara>
</warning>
</sect2>
Expand Down
53 changes: 38 additions & 15 deletions language/predefined/attributes/allowdynamicproperties.xml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: 8dc5bef8981ffd33c8c51f7f33414fcf5c03767a Maintainer: PhilDaiguille Status: ready -->
<!-- EN-Revision: 822b0828562580aac0327eb2d84e8e6e06e51a98 Maintainer: PhilDaiguille Status: ready -->
<!-- Reviewed: yes Maintainer: Marqitos-->
<reference xml:id="class.allowdynamicproperties" role="class" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xi="http://www.w3.org/2001/XInclude">
<title>El atributo AllowDynamicProperties</title>
Expand All @@ -22,6 +22,15 @@
explícitamente.
</simpara>
</note>
<note>
<simpara>
Este atributo se introdujo en PHP 8.2.0 como la forma explícita de
permitir propiedades dinámicas. Crear una propiedad dinámica en una clase
que no utiliza este atributo, y que no implementa
<link linkend="object.get">__get()</link> ni
<link linkend="object.set">__set()</link>, está deprecado.
</simpara>
</note>
</section>

<section xml:id="allowdynamicproperties.synopsis">
Expand All @@ -42,33 +51,47 @@

<section>
&reftitle.examples;
<simpara>
Las propiedades dinámicas están deprecadas a partir de PHP 8.2.0,
por lo que usarlas sin marcar la clase con este atributo emitirá
un aviso de deprecación.
</simpara>
<example>
<title>AllowDynamicProperties con propiedad inexistente</title>
<title>AllowDynamicProperties con una propiedad dinámica</title>
<simpara>
Para habilitar las propiedades dinámicas, añada
<literal>#[\AllowDynamicProperties]</literal>.
</simpara>
<programlisting role="php">
<![CDATA[
<?php
class DefaultBehaviour { }

#[\AllowDynamicProperties]
class ClassAllowsDynamicProperties { }
class ValidExample { }

$o1 = new DefaultBehaviour();
$o2 = new ClassAllowsDynamicProperties();
$obj = new ValidExample();
$obj->myDynamicProp = 1234;
?>
]]>
</programlisting>
</example>

$o1->nonExistingProp = true;
$o2->nonExistingProp = true;
<example>
<title>AllowDynamicProperties con propiedad inexistente</title>
<simpara>
A partir de PHP 8.2.0, la declaración es obligatoria a menos que la clase
utilice este atributo. Crear una propiedad no declarada en una clase de
este tipo emite un aviso de deprecación.
</simpara>

<programlisting role="php">
<![CDATA[
<?php
class InvalidExample { }

$obj = new InvalidExample();
$obj->myUnknownProperty = 1234;
?>
]]>
</programlisting>
&example.outputs.82;
<screen>
<![CDATA[
Deprecated: Creation of dynamic property DefaultBehaviour::$nonExistingProp is deprecated in file on line 10
Deprecated: Creation of dynamic property InvalidExample::$myUnknownProperty is deprecated in file on line 5
]]>
</screen>
</example>
Expand Down
Loading