1
0
mirror of https://github.com/php/doc-es.git synced 2026-03-26 00:12:06 +01:00
Files
archived-doc-es/language/oop5/overloading.xml
Pedro Antonio Gil Rodríguez 4d64eef55c Actualización a la última versión
git-svn-id: https://svn.php.net/repository/phpdoc/es/trunk@334368 c90b9560-bf6c-de11-be94-00142212c4b1
2014-07-23 09:43:53 +00:00

368 lines
11 KiB
XML

<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: 7850a1abc67b583007309a3c2fcaf5c8908b13c9 Maintainer: chuso Status: ready -->
<!-- Reviewed: no -->
<sect1 xml:id="language.oop5.overloading" xmlns="http://docbook.org/ns/docbook">
<title>Sobrecarga</title>
<para>
La sobrecarga en PHP ofrece los medios para <quote>crear</quote>
dinámicamente propiedades y métodos. Estas entidades dinámicas se
procesan por los métodos mágicos que se pueden establecer en una clase
para diversas acciones.
</para>
<para>
Se invoca a los métodos de sobrecarga cuando se interactúa
con propiedades o métodos que no se han declarado o que no son
<link linkend="language.oop5.visibility">visibles</link> en el
ámbito activo. A lo largo de esta sección usaremos los términos
<quote>propiedades inaccesibles</quote> y <quote>métodos
inaccesibles</quote> para referirnos a esta combinación de declaración
y visibilidad.
</para>
<para>
Todos los métodos sobrecargados deben definirse como <literal>public</literal>.
</para>
<note>
<para>
No se puede pasar ninguno de los parámetros de estos métodos mágicos
<link linkend="functions.arguments.by-reference">por
referencia</link>.
</para>
</note>
<note>
<para>
La interpretación de PHP de <quote>overloading</quote> es distinta
de la mayoría de los lenguajes orientados a objetos. La sobrecarga
tradicionalmente ofrece la capacidad de tener múltiples métodos
con el mismo nombre, pero con un tipo o un número distinto de
parámetros.
</para>
</note>
<sect2 xml:id="language.oop5.overloading.changelog">
&reftitle.changelog;
<para>
<informaltable>
<tgroup cols="2">
<thead>
<row>
<entry>&Version;</entry>
<entry>&Description;</entry>
</row>
</thead>
<tbody>
<row>
<entry>5.3.0</entry>
<entry>
Se añadió <link linkend="object.callstatic">__callStatic</link>.
Se añadieron advertencias para hacer cumplir la visibilidad pública e impedir la declaración static.
</entry>
</row>
<row>
<entry>5.1.0</entry>
<entry>
Se añadieron <link linkend="object.isset">__isset()</link> y <link linkend="object.unset">__unset()</link>.
Se añadió el soporte para <link linkend="object.get">__get()</link> para la sobrecarga de propiedades privadas.
</entry>
</row>
<row>
<entry>5.0.0</entry>
<entry>
Se añadió <link linkend="object.get">__get()</link>.
</entry>
</row>
</tbody>
</tgroup>
</informaltable>
</para>
</sect2>
<sect2 xml:id="language.oop5.overloading.members">
<title>Sobrecarga de propiedades</title>
<methodsynopsis xml:id="object.set">
<modifier>public</modifier> <type>void</type><methodname>__set</methodname>
<methodparam><type>string</type><parameter>name</parameter></methodparam>
<methodparam><type>mixed</type><parameter>value</parameter></methodparam>
</methodsynopsis>
<methodsynopsis xml:id="object.get">
<modifier>public</modifier> <type>mixed</type><methodname>__get</methodname>
<methodparam><type>string</type><parameter>name</parameter></methodparam>
</methodsynopsis>
<methodsynopsis xml:id="object.isset">
<modifier>public</modifier> <type>bool</type><methodname>__isset</methodname>
<methodparam><type>string</type><parameter>name</parameter></methodparam>
</methodsynopsis>
<methodsynopsis xml:id="object.unset">
<modifier>public</modifier> <type>void</type><methodname>__unset</methodname>
<methodparam><type>string</type><parameter>name</parameter></methodparam>
</methodsynopsis>
<para>
<link linkend="object.set">__set()</link> se ejecuta al escribir datos sobre
propiedades inaccesibles.
</para>
<para>
<link linkend="object.get">__get()</link> se utiliza para consultar datos a partir de
propiedades inaccesibles.
</para>
<para>
<link linkend="object.isset">__isset()</link> se lanza al llamar a
<function>isset</function> o a <function>empty</function>
sobre propiedades inaccesibles.
</para>
<para>
<link linkend="object.unset">__unset()</link> se invoca cuando se usa
<function>unset</function> sobre propiedades inaccesibles.
</para>
<para>
El parámetro <varname>$name</varname> es el nombre de la propiedad con
la que se está interactuando. En el método <link linkend="object.set">__set()</link>
el parámetro <varname>$value</varname> especifica el valor que se debe
asignar a la propiedad
<varname>$name</varname>.
</para>
<para>
La sobrecarga de propiedades sólo funciona en contextos de objetos. Estos métodos
mágicos no se lanzarán en contextos estáticos. Por esa razón, no se
deben declarar como
<link linkend="language.oop5.static">estáticos</link>. Desde PHP
5.3.0, se emite un aviso si alguno de los métodos de sobrecarga
es declarado como <literal>static</literal>.
</para>
<note>
<para>
Debido a la forma en que PHP procesa el operador de asignación,
el valor que devuelve <link linkend="object.set">__set()</link> se ignora.
Del mismo modo, nunca se llama a <link linkend="object.get">__get()</link> al
encadenar asignaciones como esta:
<literal><![CDATA[ $a = $obj->b = 8; ]]></literal>
</para>
</note>
<example>
<title>
Sobrecarga de propiedades mediante los métodos <link linkend="object.get">__get()</link>,
<link linkend="object.set">__set()</link>, <link linkend="object.isset">__isset()</link>
y <link linkend="object.unset">__unset()</link>
</title>
<programlisting role="php">
<![CDATA[
<?php
class PropertyTest
{
/** Localización de los datos sobrecargados. */
private $data = array();
/** La sobrecarga no se usa en propiedades declaradas. */
public $declared = 1;
/** La sobre carga sólo funciona aquí al acceder desde fuera de la clase. */
private $hidden = 2;
public function __set($name, $value)
{
echo "Estableciendo '$name' a '$value'\n";
$this->data[$name] = $value;
}
public function __get($name)
{
echo "Consultando '$name'\n";
if (array_key_exists($name, $this->data)) {
return $this->data[$name];
}
$trace = debug_backtrace();
trigger_error(
'Propiedad indefinida mediante __get(): ' . $name .
' en ' . $trace[0]['file'] .
' en la línea ' . $trace[0]['line'],
E_USER_NOTICE);
return null;
}
/** Desde PHP 5.1.0 */
public function __isset($name)
{
echo "¿Está definido '$name'?\n";
return isset($this->data[$name]);
}
/** Desde PHP 5.1.0 */
public function __unset($name)
{
echo "Eliminando '$name'\n";
unset($this->data[$name]);
}
/** No es un método mágico, esta aquí para completar el ejemplo. */
public function getHidden()
{
return $this->hidden;
}
}
echo "<pre>\n";
$obj = new PropertyTest;
$obj->a = 1;
echo $obj->a . "\n\n";
var_dump(isset($obj->a));
unset($obj->a);
var_dump(isset($obj->a));
echo "\n";
echo $obj->declared . "\n\n";
echo "Vamos a probar con la propiedad privada que se llama 'hidden':\n";
echo "Las propiedades privadas pueden consultarse en la clase, por lo que no se usa __get()...\n";
echo $obj->getHidden() . "\n";
echo "Las propiedades privadas no son visibles fuera de la clase, por lo que se usa __get()...\n";
echo $obj->hidden . "\n";
?>
]]>
</programlisting>
&example.outputs;
<screen role="php">
<![CDATA[
Estableciendo 'a' a '1'
Consultando 'a'
1
¿Está definido 'a'?
bool(true)
Eliminando 'a'
¿Está definido 'a'?
bool(false)
1
Vamos a probar con la propiedad privada que se llama 'hidden':
Las propiedades privadas pueden consultarse en la clase, por lo que no se usa __get()...
2
Las propiedades privadas no son visibles fuera de la clase, por lo que se usa __get()...
Consultando 'hidden'
Notice: Propiedad indefinida mediante __get(): hidden en <file> en la línea 69 in <file>en la línea 28
]]>
</screen>
</example>
</sect2>
<sect2 xml:id="language.oop5.overloading.methods">
<title>Sobrecarga de métodos</title>
<methodsynopsis xml:id="object.call">
<modifier>public</modifier> <type>mixed</type><methodname>__call</methodname>
<methodparam><type>string</type><parameter>name</parameter></methodparam>
<methodparam><type>array</type><parameter>arguments</parameter></methodparam>
</methodsynopsis>
<methodsynopsis xml:id="object.callstatic">
<modifier>public static</modifier> <type>mixed</type><methodname>__callStatic</methodname>
<methodparam><type>string</type><parameter>name</parameter></methodparam>
<methodparam><type>array</type><parameter>arguments</parameter></methodparam>
</methodsynopsis>
<para>
<link linkend="object.call">__call()</link> es lanzado al invocar
un método inaccesible en un contexto de objeto.
</para>
<para>
<link linkend="object.callstatic">__callStatic()</link> es lanzado al invocar
un método inaccesible en un contexto estático.
</para>
<para>
El parámetro <varname>$name</varname> corresponde al nombre del
método al que se está llamando. El parámetro <varname>$arguments</varname>
es un array enumerado que contiene los parámetros
que se han pasado al método <varname>$name</varname>.
</para>
<example>
<title>
Sobrecarga de métodos mediante los métodos <link linkend="object.call">__call()</link>
and <link linkend="object.callstatic">__callStatic()</link>
</title>
<programlisting role="php">
<![CDATA[
<?php
class MethodTest
{
public function __call($name, $arguments)
{
// Nota: el valor $name es sensible a mayúsculas.
echo "Llamando al método de objeto '$name' "
. implode(', ', $arguments). "\n";
}
/** Desde PHP 5.3.0 */
public static function __callStatic($name, $arguments)
{
// Nota: el valor $name es sensible a mayúsculas.
echo "Llamando al método estático '$name' "
. implode(', ', $arguments). "\n";
}
}
$obj = new MethodTest;
$obj->runTest('en contexto de objeto');
MethodTest::runTest('en contexto estático'); // Desde PHP 5.3.0
?>
]]>
</programlisting>
&example.outputs;
<screen role="php">
<![CDATA[
Llamando al método de objeto 'runTest' en contexto de objeto
Llamando al método estático 'runTest' en contexto estático
]]>
</screen>
</example>
</sect2>
</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
-->