mirror of
https://github.com/php/doc-es.git
synced 2026-03-24 07:22:16 +01:00
208 lines
6.7 KiB
XML
208 lines
6.7 KiB
XML
<?xml version="1.0" encoding="utf-8"?>
|
|
<!-- EN-Revision: f94d903985119d3ac00f4528551df947f57b667f Maintainer: PhilDaiguille Status: ready -->
|
|
<!-- Reviewed: no -->
|
|
<sect1 xml:id="language.oop5.inheritance" xmlns="http://docbook.org/ns/docbook">
|
|
<title>Herencia</title>
|
|
<para>
|
|
La herencia es uno de los grandes principios de la programación orientada a objetos (POO), y
|
|
PHP la implementa en su modelo de objetos. Este principio afectará la manera en que
|
|
muchas clases están relacionadas entre sí.
|
|
</para>
|
|
<para>
|
|
Por ejemplo, cuando una clase es extendida, la clase hija hereda todas
|
|
las métodos públicos y protegidos, propiedades y constantes de la clase padre. Mientras una clase no sobrescriba
|
|
estos métodos, conservan su funcionalidad original.
|
|
</para>
|
|
<para>
|
|
La herencia es muy útil para definir y abstraer ciertas funcionalidades
|
|
comunes a varias clases, permitiendo al mismo tiempo la implementación de
|
|
funcionalidades adicionales en las clases hijas, sin tener que reimplementar
|
|
en su interior todas las funcionalidades comunes.
|
|
</para>
|
|
<para>
|
|
Los métodos privados de una clase padre no son accesibles para la clase hija.
|
|
Por consiguiente, las clases hijas pueden reimplementar un método privado por sí mismas
|
|
sin preocuparse por las reglas normales de herencia.
|
|
Anterior a PHP 8.0.0, sin embargo, las restricciones <literal>final</literal>
|
|
y <literal>static</literal> se aplicaban a los métodos privados.
|
|
A partir de PHP 8.0.0, la única restricción de método privado que se impone
|
|
es <literal>private final</literal> en los constructores, ya que es una
|
|
manera común para "desactivar" el constructor cuando se utilizan métodos de fábrica estáticos en su lugar.
|
|
</para>
|
|
<para>
|
|
La <link linkend="language.oop5.visibility">visibilidad</link>
|
|
de los métodos, propiedades y constantes puede ser relajada, es decir, un
|
|
método <literal>protected</literal> puede ser marcado como
|
|
<literal>public</literal>, pero no pueden ser restringidos, por ejemplo,
|
|
marcar una propiedad <literal>public</literal> como <literal>private</literal>.
|
|
Una excepción son los constructores, para los cuales la visibilidad puede ser restringida,
|
|
por ejemplo, un constructor <literal>public</literal> puede ser anotado
|
|
como <literal>private</literal> en la clase hija.
|
|
</para>
|
|
|
|
<note>
|
|
<para>
|
|
A menos que se utilice la autocarga, las clases deben ser conocidas antes de ser
|
|
utilizadas. Las clases padres deben ser definidas antes de escribir una herencia. Esta
|
|
regla general se aplica también en el caso de herencia o implementación de interfaces.
|
|
</para>
|
|
</note>
|
|
|
|
<note>
|
|
<para>
|
|
No está permitido redefinir una propiedad de lectura-escritura con una
|
|
<link linkend="language.oop5.properties.readonly-properties">propiedad de solo lectura</link> o viceversa.
|
|
<informalexample>
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?php
|
|
|
|
class A {
|
|
public int $prop;
|
|
}
|
|
class B extends A {
|
|
// Ilegal: read-write -> readonly
|
|
public readonly int $prop;
|
|
}
|
|
?>
|
|
]]>
|
|
</programlisting>
|
|
</informalexample>
|
|
</para>
|
|
</note>
|
|
|
|
<example>
|
|
<title>Ejemplo de herencia</title>
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?php
|
|
|
|
class Foo
|
|
{
|
|
public function printItem($string)
|
|
{
|
|
echo 'Foo: ' . $string . PHP_EOL;
|
|
}
|
|
|
|
public function printPHP()
|
|
{
|
|
echo 'PHP es genial' . PHP_EOL;
|
|
}
|
|
}
|
|
|
|
class Bar extends Foo
|
|
{
|
|
public function printItem($string)
|
|
{
|
|
echo 'Bar: ' . $string . PHP_EOL;
|
|
}
|
|
}
|
|
|
|
$foo = new Foo();
|
|
$bar = new Bar();
|
|
$foo->printItem('baz'); // Muestra: 'Foo: baz'
|
|
$foo->printPHP(); // Muestra: 'PHP es genial'
|
|
$bar->printItem('baz'); // Muestra: 'Bar: baz'
|
|
$bar->printPHP(); // Muestra: 'PHP es genial'
|
|
|
|
?>
|
|
]]>
|
|
</programlisting>
|
|
</example>
|
|
|
|
<sect2 xml:id="language.oop5.inheritance.internal-classes">
|
|
<title>Compatibilidad de los tipos de retorno con las clases internas</title>
|
|
|
|
<para>
|
|
Anterior a PHP 8.1, la mayoría de las clases o métodos internos no declaraban su
|
|
tipo de retorno, y cualquier tipo de retorno estaba permitido al heredarlos.
|
|
</para>
|
|
|
|
<para>
|
|
A partir de PHP 8.1.0, la mayoría de los métodos internos comenzaron a declarar "provisionalmente"
|
|
su tipo de retorno, en este caso, el tipo de retorno de los métodos debe ser compatible con la clase
|
|
padre; en caso contrario, se emite una notificación de deprecación.
|
|
Tenga en cuenta que la ausencia de una declaración de retorno explícita también se considera un error de firma, y por lo tanto provoca el aviso de deprecación.
|
|
</para>
|
|
|
|
<para>
|
|
Si el tipo de retorno no puede ser declarado para un método de sobrecarga debido a problemas de
|
|
compatibilidad entre versiones de PHP, un atributo <classname>ReturnTypeWillChange</classname> puede ser
|
|
añadido para silenciar el aviso de deprecación.
|
|
</para>
|
|
|
|
<example>
|
|
<title>El método sobrecargado no declara tipo de retorno.</title>
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?php
|
|
|
|
class MyDateTime extends DateTime
|
|
{
|
|
public function modify(string $modifier) { return false; }
|
|
}
|
|
|
|
// "Deprecated: Return type of MyDateTime::modify(string $modifier) should either be compatible with DateTime::modify(string $modifier): DateTime|false, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice" A partir de PHP 8.1.0
|
|
]]>
|
|
</programlisting>
|
|
</example>
|
|
|
|
<example>
|
|
<title>El método sobrecargado declara un tipo de retorno incorrecto.</title>
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?php
|
|
|
|
class MyDateTime extends DateTime
|
|
{
|
|
public function modify(string $modifier): ?DateTime { return null; }
|
|
}
|
|
|
|
// "Deprecated: Return type of MyDateTime::modify(string $modifier): ?DateTime should either be compatible with DateTime::modify(string $modifier): DateTime|false, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice" A partir de PHP 8.1.0
|
|
]]>
|
|
</programlisting>
|
|
</example>
|
|
|
|
<example>
|
|
<title>El método sobrecargado declara un tipo de retorno incorrecto sin aviso de deprecación.</title>
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?php
|
|
|
|
class MyDateTime extends DateTime
|
|
{
|
|
/**
|
|
* @return DateTime|false
|
|
*/
|
|
#[\ReturnTypeWillChange]
|
|
public function modify(string $modifier) { return false; }
|
|
}
|
|
|
|
// No se emite ningún aviso
|
|
]]>
|
|
</programlisting>
|
|
</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
|
|
-->
|