1
0
mirror of https://github.com/php/doc-es.git synced 2026-03-24 07:22:16 +01:00
Files
archived-doc-es/language/oop5/inheritance.xml
2025-05-06 21:45:14 +02:00

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
-->