1
0
mirror of https://github.com/php/doc-ru.git synced 2026-04-26 16:58:14 +02:00
Files
archived-doc-ru/language/oop5/abstract.xml
T
aleksandr-shevchenko 34114fcba5 Update abstract.xml (#382)
2021-12-23 15:23:18 +03:00

143 lines
4.2 KiB
XML

<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: 9ee9eccf455188ab6eb352194eb6f9eb99e15606 Maintainer: shein Status: ready -->
<!-- Reviewed: no -->
<sect1 xml:id="language.oop5.abstract" xmlns="http://docbook.org/ns/docbook">
<title>Абстрактные классы</title>
<para>
PHP поддерживает определение абстрактных классов и методов. На основе абстрактного класса
нельзя создавать объекты, и любой класс, содержащий хотя бы один абстрактный метод,
должен быть определён как абстрактный. Методы, объявленные абстрактными, несут, по существу,
лишь описательный смысл и не могут включать реализацию.
</para>
<para>
При наследовании от абстрактного класса, все методы, помеченные абстрактными
в родительском классе, должны быть определены в дочернем классе и
следовать обычным правилам <link linkend="language.oop5.inheritance">наследования</link>
и <link linkend="language.oop.lsp">совместимости сигнатуры</link>.
</para>
<example>
<title>Пример абстрактного класса</title>
<programlisting role="php">
<![CDATA[
<?php
abstract class AbstractClass
{
// Данные методы должны быть определены в дочернем классе
abstract protected function getValue();
abstract protected function prefixValue($prefix);
// Общий метод
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>Пример абстрактного класса</title>
<programlisting role="php">
<![CDATA[
<?php
abstract class AbstractClass
{
// Наш абстрактный метод требует только определить необходимые аргументы
abstract protected function prefixName($name);
}
class ConcreteClass extends AbstractClass
{
// Наш дочерний класс может определить необязательные аргументы, не указанные в объявлении родительского метода
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
-->