mirror of
https://github.com/macintoshplus/doc-fr.git
synced 2026-03-25 17:32:07 +01:00
209 lines
6.8 KiB
XML
209 lines
6.8 KiB
XML
<?xml version="1.0" encoding="utf-8"?>
|
|
<!-- EN-Revision: 081cf71ecb97b239c1e07beaadb71af0b0c42764 Maintainer: yannick Status: ready -->
|
|
<!-- Reviewed: no -->
|
|
<sect1 xml:id="language.oop5.inheritance" xmlns="http://docbook.org/ns/docbook">
|
|
<title>Héritage</title>
|
|
<para>
|
|
L'héritage est un des grands principes de la programmation orientée objet (POO), et
|
|
PHP l'implémente dans son modèle objet. Ce principe va affecter la manière dont
|
|
de nombreuses classes sont en relation les unes avec les autres.
|
|
</para>
|
|
<para>
|
|
Par exemple, lorsqu'une classe est étendue, la classe enfant hérite de toutes
|
|
les méthodes publiques et protégées, propriétés et constantes de la classe parente.
|
|
Tant qu'une classe n'écrase
|
|
pas ces méthodes, elles conservent leur fonctionnalité d'origine.
|
|
</para>
|
|
<para>
|
|
L'héritage est très utile pour définir et abstraire certaines fonctionnalités
|
|
communes à plusieurs classes, tout en permettant la mise en place de
|
|
fonctionnalités supplémentaires dans les classes enfants, sans avoir à réimplémenter
|
|
en leur sein toutes les fonctionnalités communes.
|
|
</para>
|
|
<para>
|
|
Les méthodes privées d'une classe parente ne sont pas accessible à la classe enfant.
|
|
Par conséquent, les classes enfant peuvent réimplémenter une méthode privée eux-mêmes
|
|
sans se soucier des règles d'héritage normales.
|
|
Antérieur à PHP 8.0.0, cependant, les restrictions <literal>final</literal>
|
|
et <literal>static</literal> étaient appliquées aux méthodes privées.
|
|
À partir de PHP 8.0.0, l'unique restriction de méthode privée qui est imposé
|
|
est <literal>private final</literal> sur les constructeurs, car c'est une
|
|
manière courante pour "désactiver" le constructeur lors de l'utilisation
|
|
de méthodes factory statique à la place.
|
|
</para>
|
|
<para>
|
|
La <link linkend="language.oop5.visibility">visibilité</link>
|
|
des méthodes, propriétés et constantes peut être relaxé, c.-à-d. une
|
|
méthode <literal>protected</literal> peut être marqué comme
|
|
<literal>public</literal>, mais elles ne peuvent pas être restraint, e.g.
|
|
marquer une propriété <literal>public</literal> comme <literal>private</literal>.
|
|
</para>
|
|
|
|
<note>
|
|
<para>
|
|
A moins que l'autochargement ne soit utilisé, les classes doivent être connues avant d'être
|
|
utilisées. Les classes mères doivent être définies avant l'écriture d'un héritage. Cette
|
|
règle générale s'applique aussi dans le cas d'héritage ou d'implémentation d'interfaces.
|
|
</para>
|
|
</note>
|
|
|
|
<note>
|
|
<para>
|
|
Il n'est pas autorisé de redéfinir une propriété en lecture-écriture avec une
|
|
<link linkend="language.oop5.properties.readonly-properties">propriété en lecture seule</link> ou vice versa.
|
|
<example>
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?php
|
|
|
|
class A {
|
|
public int $prop;
|
|
}
|
|
class B extends A {
|
|
// Illegal: read-write -> readonly
|
|
public readonly int $prop;
|
|
}
|
|
?>
|
|
]]>
|
|
</programlisting>
|
|
</example>
|
|
</para>
|
|
</note>
|
|
|
|
<sect2 xml:id="language.oop5.inheritance.examples">
|
|
<example xml:id="language.oop5.inheritance.examples.ex1">
|
|
<title>Exemple d'héritage</title>
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?php
|
|
|
|
class Foo
|
|
{
|
|
public function printItem($string)
|
|
{
|
|
echo 'Foo: ' . $string . PHP_EOL;
|
|
}
|
|
|
|
public function printPHP()
|
|
{
|
|
echo 'PHP est super' . PHP_EOL;
|
|
}
|
|
}
|
|
|
|
class Bar extends Foo
|
|
{
|
|
public function printItem($string)
|
|
{
|
|
echo 'Bar: ' . $string . PHP_EOL;
|
|
}
|
|
}
|
|
|
|
$foo = new Foo();
|
|
$bar = new Bar();
|
|
$foo->printItem('baz'); // Affiche : 'Foo: baz'
|
|
$foo->printPHP(); // Affiche : 'PHP est super'
|
|
$bar->printItem('baz'); // Affiche : 'Bar: baz'
|
|
$bar->printPHP(); // Affiche : 'PHP est super'
|
|
|
|
?>
|
|
]]>
|
|
</programlisting>
|
|
</example>
|
|
</sect2>
|
|
<sect2 xml:id="language.oop5.inheritance.internal-classes">
|
|
<title>Compatibilité des types de retour avec les classes internes</title>
|
|
|
|
<para>
|
|
Antérieur à PHP 8.1, la plupart des classes ou méthodes internes ne déclaraient pas leur
|
|
type de retour, et tout type de retour était autorisé lors de leur héritage.
|
|
</para>
|
|
|
|
<para>
|
|
À partir de PHP 8.1.0, la plupart des méthodes internes ont commencé à déclarer "provisoirement"
|
|
leur type de retour, dans ce cas, le type de retour des méthodes doit être compatible avec la classe
|
|
parent; Dans le cas contraire, une notification de dépréciation est émise.
|
|
Notez que l'absence d'une déclaration de retour explicite est également considérée comme une
|
|
erreur de signature, et entraîne donc l'avis de dépréciation.
|
|
</para>
|
|
|
|
<para>
|
|
Si le type de retour ne peut être déclaré pour une méthode de surcharge en raison de problèmes de
|
|
compatibilité entre versions de PHP, un attribut <code>#[ReturnTypeWillChange]</code> peut être
|
|
ajouté pour passer sous silence l'avis de dépréciation.
|
|
</para>
|
|
|
|
<example>
|
|
<title>La méthode surchargée ne déclare pas de type de retour.</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" À partir de PHP 8.1.0
|
|
]]>
|
|
</programlisting>
|
|
</example>
|
|
|
|
<example>
|
|
<title>La méthode surchargée déclare un mauvais type de retour.</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" À partir de PHP 8.1.0
|
|
]]>
|
|
</programlisting>
|
|
</example>
|
|
|
|
<example>
|
|
<title>La méthode surchargée déclare un mauvais type de retour sans notice de dépréciation.</title>
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?php
|
|
|
|
class MyDateTime extends DateTime
|
|
{
|
|
/**
|
|
* @return DateTime|false
|
|
*/
|
|
#[ReturnTypeWillChange]
|
|
public function modify(string $modifier) { return false; }
|
|
}
|
|
|
|
// Aucune notice n'est déclenchée
|
|
]]>
|
|
</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
|
|
-->
|