mirror of
https://github.com/php/doc-es.git
synced 2026-03-26 00:12:06 +01:00
git-svn-id: https://svn.php.net/repository/phpdoc/es/trunk@334368 c90b9560-bf6c-de11-be94-00142212c4b1
368 lines
11 KiB
XML
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
|
|
-->
|