Files
doc-fr/language/oop5/abstract.xml
George Peter Banyard 66e0862a74 Apply commit 9ee9eccf455188ab6eb352194eb6f9eb99e15606
Refactor OO section part 2
2021-03-17 14:52:17 +00:00

148 lines
3.6 KiB
XML

<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: 9ee9eccf455188ab6eb352194eb6f9eb99e15606 Maintainer: yannick Status: ready -->
<!-- Reviewed: no -->
<sect1 xml:id="language.oop5.abstract" xmlns="http://docbook.org/ns/docbook">
<title>Abstraction de classes</title>
<para>
PHP a des classes et méthodes abstraites.
Les classes définies comme abstraites ne peuvent pas être
instanciées, et toute classe contenant au moins une
méthode abstraite doit elle-aussi être abstraite.
Les méthodes définies comme abstraites déclarent simplement la signature
de la méthode ; elles ne peuvent définir son implémentation.
</para>
<para>
Lors de l'héritage d'une classe abstraite, toutes les méthodes
marquées comme abstraites dans la déclaration de la classe parente
doivent être définies par la classe enfant et suivre les règles habituelles
d'<link linkend="language.oop5.inheritance">héritage</link> et de
<link linkend="language.oop.lsp">compatibilité de signature</link>.
</para>
<example>
<title>Exemple de classe abstraite</title>
<programlisting role="php">
<![CDATA[
<?php
abstract class AbstractClass
{
// Force les classes filles à définir cette méthode
abstract protected function getValue();
abstract protected function prefixValue($prefix);
// méthode commune
public function printOut() {
print $this->getValue() . "\n";
}
}
class ConcreteClass1 extends AbstractClass
{
protected function getValue() {
return "ConcreteClass1";
}
public function prefixValue($prefix) {
return "{$prefix}ConcreteClass1";
}
}
class ConcreteClass2 extends AbstractClass
{
public function getValue() {
return "ConcreteClass2";
}
public function prefixValue($prefix) {
return "{$prefix}ConcreteClass2";
}
}
$class1 = new ConcreteClass1;
$class1->printOut();
echo $class1->prefixValue('FOO_') ."\n";
$class2 = new ConcreteClass2;
$class2->printOut();
echo $class2->prefixValue('FOO_') ."\n";
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
ConcreteClass1
FOO_ConcreteClass1
ConcreteClass2
FOO_ConcreteClass2
]]>
</screen>
</example>
<example>
<title>Exemple avec une classe abstraite</title>
<programlisting role="php">
<![CDATA[
<?php
abstract class AbstractClass
{
// Notre méthode abstraite ne doit que définir les arguments requis
abstract protected function prefixName($name);
}
class ConcreteClass extends AbstractClass
{
// Notre classe enfant peut définir des arguments optionnels non présents dans la signature du parent
public function prefixName($name, $separator = ".") {
if ($name == "Pacman") {
$prefix = "Mr";
} elseif ($name == "Pacwoman") {
$prefix = "Mrs";
} else {
$prefix = "";
}
return "{$prefix}{$separator} {$name}";
}
}
$class = new ConcreteClass;
echo $class->prefixName("Pacman"), "\n";
echo $class->prefixName("Pacwoman"), "\n";
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
Mr. Pacman
Mrs. Pacwoman
]]>
</screen>
</example>
</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
-->