<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/language.oop5.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'ru',
  ),
  'this' => 
  array (
    0 => 'language.oop5.interfaces.php',
    1 => 'Интерфейсы объектов',
    2 => 'Интерфейсы объектов',
  ),
  'up' => 
  array (
    0 => 'language.oop5.php',
    1 => 'Классы и объекты',
  ),
  'prev' => 
  array (
    0 => 'language.oop5.abstract.php',
    1 => 'Абстракция класса',
  ),
  'next' => 
  array (
    0 => 'language.oop5.traits.php',
    1 => 'Трейты',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'ru',
    'path' => 'language/oop5/interfaces.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="language.oop5.interfaces" class="sect1">
 <h2 class="title">Интерфейсы объектов</h2>
 <p class="para">
  Интерфейсы объектов разрешают создавать код, который
  указывает, какие методы и свойства требуется реализовать в классе,
  без определения реализации этих методов или свойств.
  Интерфейсы разделяют пространство имён с классами, трейтами
  и перечислениями, поэтому им нельзя давать одинаковые названия.
 </p>
 <p class="para">
  Интерфейсы определяются так же, как классы, но с ключевым словом
  <code class="literal">interface</code> вместо слова <code class="literal">class</code>
  и с методами, ни один из которых не определяет содержимое тела.
 </p>
 <p class="para">
  Методы интерфейса объявляются общедоступными,
  что вытекает из самой природы интерфейса.
 </p>
 <p class="para">
  Интерфейсы преследуют две взаимодополняющие цели:
 </p>
 <ul class="simplelist">
  <li>
   Разрешают разработчикам создавать объекты разноимённых классов, которые умеют взаимно заменять друг друга,
   поскольку реализуют один и тот же интерфейс или интерфейсы.
   Интерфейсы часто внедряют в код, когда требуется создать набор служб доступа к базе данных,
   платёжных шлюзов или стратегий кеширования. Один класс подменяют другим без изменения кода, который его использует.
  </li>
  <li>
   Разрешают параметру функции или метода принимать и обрабатывать объект, который подчиняется контракту интерфейса,
   чтобы не заботиться о том, что ещё умеет делать объект или как его реализовали.
   Интерфейсы часто называют <code class="literal">Iterable</code>, <code class="literal">Cacheable</code>, <code class="literal">Renderable</code>
   и другими похожими именами, чтобы описать поведение интерфейса.
  </li>
 </ul>
 <p class="para">
  В интерфейсах также определяют
  <a href="language.oop5.magic.php" class="link">магические методы</a>, чтобы потребовать от классов,
  которые реализуют интерфейс, реализации этих методов.
 </p>

 <blockquote class="note"><p><strong class="note">Замечание</strong>: 
  <p class="para">
   Лучше не включать <a href="language.oop5.decon.php#language.oop5.decon.constructor" class="link">конструкторы</a> в интерфейсы,
   чтобы не снижать гибкость объекта, который реализует интерфейс,
   хотя включение конструкторов и поддерживается.
   Конструкторы, кроме того, не соблюдают правила наследования, из-за чего поведение иногда становится противоречивым
   и неожиданным.
  </p>
 </p></blockquote>

 <div class="sect2" id="language.oop5.interfaces.implements">
  <h3 class="title"><code class="literal">Оператор implements</code></h3>
  <p class="para">
   Для реализации интерфейса используется оператор <code class="literal">implements</code>.
   Класс должен реализовать все методы, описанные в интерфейсе, иначе
   произойдёт фатальная ошибка. При желании классы могут реализовывать
   более одного интерфейса, разделяя каждый интерфейс запятой.
  </p>
  <div class="warning"><strong class="warning">Внимание</strong>
   <p class="para">
    Параметрам в методах класса, в котором реализуется интерфейс, разрешается указывать названия,
    которые не совпадают с названиями параметров в методах интерфейса. Но начиная с PHP 8.0 язык поддерживает
    <a href="functions.arguments.php#functions.named-arguments" class="link">именованные аргументы</a>, и код, в котором вызываются методы интерфейса,
    часто полагается на названия параметров в интерфейсе.
    Поэтому разработчикам рекомендуют указывать в методах те же названия параметров,
    что и в реализуемом интерфейсе.
   </p>
  </div>
  <blockquote class="note"><p><strong class="note">Замечание</strong>: 
   <p class="para">
    Аналогично классам, интерфейсы расширяют оператором
    <a href="language.oop5.inheritance.php" class="link">extends</a>.
   </p>
  </p></blockquote>
  <blockquote class="note"><p><strong class="note">Замечание</strong>: 
   <p class="para">
    Класс, которым реализуется интерфейс, обязан объявить каждый метод интерфейса
    <a href="language.oop5.basic.php#language.oop.lsp" class="link">по правилам совместимости сигнатур</a>.
    Реализация методов обязана следовать <a href="language.oop5.basic.php#language.oop.lsp" class="link">правилам совместимости сигнатур</a>
    для каждого интерфейса, когда класс реализует больше одного интерфейса,
    в котором объявили методы с одинаковым названием. Поэтому при организации иерархии типов PHP-разработчики
    пользуются доступной в языке <a href="language.oop5.variance.php" class="link">ковариантностью и контравариантностью</a>.
   </p>
  </p></blockquote>
 </div>
 
 <div class="sect2" id="language.oop5.interfaces.constants">
  <h3 class="title">Константы</h3>
  <p class="para">
   Интерфейсы поддерживают объявления констант. Константы интерфейсов
   работают так же, как <a href="language.oop5.constants.php" class="link">константы классов</a>.
   До PHP 8.1.0 константы интерфейса нельзя было переопределять в производном классе или интерфейсе.
  </p>
 </div>
  <div class="sect2" id="language.oop5.interfaces.properties">
   <h3 class="title">Properties</h3>
   <p class="simpara">
    Начиная с PHP 8.4.0 в интерфейсах разрешили объявлять свойства.
    При объявлении свойств потребуется указать, доступно ли свойство для чтения,
    записи или и того, и другого.
    Объявление интерфейса применяется только к открытому доступу на чтение и запись.
   </p>
   <p class="simpara">
    Класс удовлетворяет свойству интерфейса несколькими способами:
    класс определяет открытое свойство,
    <a href="language.oop5.property-hooks.php#language.oop5.property-hooks.virtual" class="link">виртуальное свойство</a>,
    которое реализует только тот хук, который соответствует хуку интерфейса,
    или определяет <code class="literal">readonly</code>-свойство, которое удовлетворяет свойству интерфейса для чтения.
    Однако в классе нельзя ограничивать доступ на запись свойства модификатором <code class="literal">readonly</code>,
    если в интерфейсе свойство объявили доступным для записи.
   </p>
   <div class="example" id="example-1">
    <p><strong>Пример #1 Пример свойств интерфейса</strong></p>
    <div class="example-contents">
<div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br /></span><span style="color: #007700">interface </span><span style="color: #0000BB">I<br /></span><span style="color: #007700">{<br />    </span><span style="color: #FF8000">// Класс, в котором реализуется свойство, ДОЛЖЕН объявить открытое для чтения свойство,<br />    // но объявление свойства в интерфейсе не ограничивает объявление доступа на запись свойства в классе<br />    </span><span style="color: #007700">public </span><span style="color: #0000BB">string $readable </span><span style="color: #007700">{<br />        </span><span style="color: #0000BB">get</span><span style="color: #007700">;<br />    }<br /><br />    </span><span style="color: #FF8000">// Класс, в котором реализуется свойство, должен объявить открытое для записи свойство,<br />    // но объявление свойства в интерфейсе не ограничивает объявление доступа на чтение свойства в классе<br />    </span><span style="color: #007700">public </span><span style="color: #0000BB">string $writeable </span><span style="color: #007700">{<br />        </span><span style="color: #0000BB">set</span><span style="color: #007700">;<br />    }<br /><br />    </span><span style="color: #FF8000">// Класс, в котором реализуется свойство, должен объявить свойство,<br />    // открытое как для чтения, так и для записи<br />    </span><span style="color: #007700">public </span><span style="color: #0000BB">string $both </span><span style="color: #007700">{<br />        </span><span style="color: #0000BB">get</span><span style="color: #007700">;<br />        </span><span style="color: #0000BB">set</span><span style="color: #007700">;<br />    }<br />}<br /><br /></span><span style="color: #FF8000">// Класс реализует каждое из трёх свойств традиционно, без хуков.<br />// Такая реализация свойств допустима<br /></span><span style="color: #007700">class </span><span style="color: #0000BB">C1 </span><span style="color: #007700">implements </span><span style="color: #0000BB">I<br /></span><span style="color: #007700">{<br />    public </span><span style="color: #0000BB">string $readable</span><span style="color: #007700">;<br /><br />    public </span><span style="color: #0000BB">string $writeable</span><span style="color: #007700">;<br /><br />    public </span><span style="color: #0000BB">string $both</span><span style="color: #007700">;<br />}<br /><br /></span><span style="color: #FF8000">// Класс реализует каждое из трёх свойств и определяет только те хуки,<br />// которые потребовал интерфейс. Такая реализация свойств тоже допустима<br /></span><span style="color: #007700">class </span><span style="color: #0000BB">C2 </span><span style="color: #007700">implements </span><span style="color: #0000BB">I<br /></span><span style="color: #007700">{<br />    private </span><span style="color: #0000BB">string $written </span><span style="color: #007700">= </span><span style="color: #DD0000">''</span><span style="color: #007700">;<br />    private </span><span style="color: #0000BB">string $all </span><span style="color: #007700">= </span><span style="color: #DD0000">''</span><span style="color: #007700">;<br /><br />    </span><span style="color: #FF8000">// Класс реализует только хук для чтения, чтобы создать виртуальное свойство.<br />    // Такое определение удовлетворяет требованию «публичной открытости для чтения».<br />    // Свойство недоступно для записи, но интерфейс и не требует открытого доступа для записи<br />    </span><span style="color: #007700">public </span><span style="color: #0000BB">string $readable </span><span style="color: #007700">{<br />        </span><span style="color: #0000BB">get </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">strtoupper</span><span style="color: #007700">(</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">writeable</span><span style="color: #007700">);<br />    }<br /><br />    </span><span style="color: #FF8000">// Интерфейс требует только того, чтобы класс определил свойство, открытое для записи,<br />    // но включение хука для операции чтения тоже допустимо.<br />    // Пример создаёт виртуальное свойство, и это нормально<br />    </span><span style="color: #007700">public </span><span style="color: #0000BB">string $writeable </span><span style="color: #007700">{<br />        </span><span style="color: #0000BB">get </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">written</span><span style="color: #007700">;<br /><br />        </span><span style="color: #0000BB">set </span><span style="color: #007700">{<br />            </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">written </span><span style="color: #007700">= </span><span style="color: #0000BB">$value</span><span style="color: #007700">;<br />        }<br />    }<br /><br />    </span><span style="color: #FF8000">// Свойство требует как операции чтения, так и операции записи,<br />    // поэтому потребуется либо реализовать оба хука, либо разрешить операциям чтения и записи<br />    // поведение по умолчанию<br />    </span><span style="color: #007700">public </span><span style="color: #0000BB">string $both </span><span style="color: #007700">{<br />        </span><span style="color: #0000BB">get </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">all</span><span style="color: #007700">;<br /><br />        </span><span style="color: #0000BB">set </span><span style="color: #007700">{<br />            </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">all </span><span style="color: #007700">= </span><span style="color: #0000BB">strtoupper</span><span style="color: #007700">(</span><span style="color: #0000BB">$value</span><span style="color: #007700">);<br />        }<br />    }<br />}<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

   </div>
  </div>
 <div class="sect2" id="language.oop5.interfaces.examples">
  <h3 class="title">Примеры</h3>
  <div class="example" id="language.oop5.interfaces.examples.ex1">
   <p><strong>Пример #2 Пример интерфейса</strong></p>
   <div class="example-contents">
<div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br /></span><span style="color: #FF8000">// Объявляем интерфейс 'Template'<br /></span><span style="color: #007700">interface </span><span style="color: #0000BB">Template<br /></span><span style="color: #007700">{<br />    public function </span><span style="color: #0000BB">setVariable</span><span style="color: #007700">(</span><span style="color: #0000BB">$name</span><span style="color: #007700">, </span><span style="color: #0000BB">$var</span><span style="color: #007700">);<br />    public function </span><span style="color: #0000BB">getHtml</span><span style="color: #007700">(</span><span style="color: #0000BB">$template</span><span style="color: #007700">);<br />}<br /><br /></span><span style="color: #FF8000">// Реализуем интерфейс<br />// Это сработает<br /></span><span style="color: #007700">class </span><span style="color: #0000BB">WorkingTemplate </span><span style="color: #007700">implements </span><span style="color: #0000BB">Template<br /></span><span style="color: #007700">{<br />    private </span><span style="color: #0000BB">$vars </span><span style="color: #007700">= [];<br /><br />    public function </span><span style="color: #0000BB">setVariable</span><span style="color: #007700">(</span><span style="color: #0000BB">$name</span><span style="color: #007700">, </span><span style="color: #0000BB">$var</span><span style="color: #007700">)<br />    {<br />        </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">vars</span><span style="color: #007700">[</span><span style="color: #0000BB">$name</span><span style="color: #007700">] = </span><span style="color: #0000BB">$var</span><span style="color: #007700">;<br />    }<br /><br />    public function </span><span style="color: #0000BB">getHtml</span><span style="color: #007700">(</span><span style="color: #0000BB">$template</span><span style="color: #007700">)<br />    {<br />        foreach (</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">vars </span><span style="color: #007700">as </span><span style="color: #0000BB">$name </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">$value</span><span style="color: #007700">) {<br />            </span><span style="color: #0000BB">$template </span><span style="color: #007700">= </span><span style="color: #0000BB">str_replace</span><span style="color: #007700">(</span><span style="color: #DD0000">'{' </span><span style="color: #007700">. </span><span style="color: #0000BB">$name </span><span style="color: #007700">. </span><span style="color: #DD0000">'}'</span><span style="color: #007700">, </span><span style="color: #0000BB">$value</span><span style="color: #007700">, </span><span style="color: #0000BB">$template</span><span style="color: #007700">);<br />        }<br /><br />        return </span><span style="color: #0000BB">$template</span><span style="color: #007700">;<br />    }<br />}<br /><br /></span><span style="color: #FF8000">// Это не сработает<br />// Fatal error: Class BadTemplate contains 1 abstract methods<br />// and must therefore be declared abstract (Template::getHtml)<br />// (Фатальная ошибка: Класс BadTemplate содержит 1 абстрактный метод<br />// и поэтому требуется объявить класс абстрактным (Template::getHtml))<br /></span><span style="color: #007700">class </span><span style="color: #0000BB">BadTemplate </span><span style="color: #007700">implements </span><span style="color: #0000BB">Template<br /></span><span style="color: #007700">{<br />    private </span><span style="color: #0000BB">$vars </span><span style="color: #007700">= [];<br /><br />    public function </span><span style="color: #0000BB">setVariable</span><span style="color: #007700">(</span><span style="color: #0000BB">$name</span><span style="color: #007700">, </span><span style="color: #0000BB">$var</span><span style="color: #007700">)<br />    {<br />        </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">vars</span><span style="color: #007700">[</span><span style="color: #0000BB">$name</span><span style="color: #007700">] = </span><span style="color: #0000BB">$var</span><span style="color: #007700">;<br />    }<br />}<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>
  <div class="example" id="language.oop5.interfaces.examples.ex2">
   <p><strong>Пример #3 Наследование интерфейсов</strong></p>
   <div class="example-contents">
<div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br /></span><span style="color: #007700">interface </span><span style="color: #0000BB">A<br /></span><span style="color: #007700">{<br />    public function </span><span style="color: #0000BB">foo</span><span style="color: #007700">();<br />}<br /><br />interface </span><span style="color: #0000BB">B </span><span style="color: #007700">extends </span><span style="color: #0000BB">A<br /></span><span style="color: #007700">{<br />    public function </span><span style="color: #0000BB">baz</span><span style="color: #007700">(</span><span style="color: #0000BB">Baz $baz</span><span style="color: #007700">);<br />}<br /><br /></span><span style="color: #FF8000">// Это сработает<br /></span><span style="color: #007700">class </span><span style="color: #0000BB">C </span><span style="color: #007700">implements </span><span style="color: #0000BB">B<br /></span><span style="color: #007700">{<br />    public function </span><span style="color: #0000BB">foo</span><span style="color: #007700">() {}<br /><br />    public function </span><span style="color: #0000BB">baz</span><span style="color: #007700">(</span><span style="color: #0000BB">Baz $baz</span><span style="color: #007700">) {}<br />}<br /><br /></span><span style="color: #FF8000">// Это не сработает и выдаст фатальную ошибку<br /></span><span style="color: #007700">class </span><span style="color: #0000BB">D </span><span style="color: #007700">implements </span><span style="color: #0000BB">B<br /></span><span style="color: #007700">{<br />    public function </span><span style="color: #0000BB">foo</span><span style="color: #007700">() {}<br /><br />    public function </span><span style="color: #0000BB">baz</span><span style="color: #007700">(</span><span style="color: #0000BB">Foo $foo</span><span style="color: #007700">) {}<br />}<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>
  <div class="example" id="language.oop5.interfaces.examples.variance.multiple.interfaces">
   <p><strong>Пример #4 Совместимость с несколькими интерфейсами</strong></p>
   <div class="example-contents">
<div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br /></span><span style="color: #007700">class </span><span style="color: #0000BB">Foo </span><span style="color: #007700">{}<br />class </span><span style="color: #0000BB">Bar </span><span style="color: #007700">extends </span><span style="color: #0000BB">Foo </span><span style="color: #007700">{}<br /><br />interface </span><span style="color: #0000BB">A<br /></span><span style="color: #007700">{<br />    public function </span><span style="color: #0000BB">myfunc</span><span style="color: #007700">(</span><span style="color: #0000BB">Foo $arg</span><span style="color: #007700">): </span><span style="color: #0000BB">Foo</span><span style="color: #007700">;<br />}<br /><br />interface </span><span style="color: #0000BB">B<br /></span><span style="color: #007700">{<br />    public function </span><span style="color: #0000BB">myfunc</span><span style="color: #007700">(</span><span style="color: #0000BB">Bar $arg</span><span style="color: #007700">): </span><span style="color: #0000BB">Bar</span><span style="color: #007700">;<br />}<br /><br />class </span><span style="color: #0000BB">MyClass </span><span style="color: #007700">implements </span><span style="color: #0000BB">A</span><span style="color: #007700">, </span><span style="color: #0000BB">B<br /></span><span style="color: #007700">{<br />    public function </span><span style="color: #0000BB">myfunc</span><span style="color: #007700">(</span><span style="color: #0000BB">Foo $arg</span><span style="color: #007700">): </span><span style="color: #0000BB">Bar<br />    </span><span style="color: #007700">{<br />        return new </span><span style="color: #0000BB">Bar</span><span style="color: #007700">();<br />    }<br />}<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>
  <div class="example" id="language.oop5.interfaces.examples.ex3">
   <p><strong>Пример #5 Множественное наследование интерфейсов</strong></p>
   <div class="example-contents">
<div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br /></span><span style="color: #007700">interface </span><span style="color: #0000BB">A<br /></span><span style="color: #007700">{<br />    public function </span><span style="color: #0000BB">foo</span><span style="color: #007700">();<br />}<br /><br />interface </span><span style="color: #0000BB">B<br /></span><span style="color: #007700">{<br />    public function </span><span style="color: #0000BB">bar</span><span style="color: #007700">();<br />}<br /><br />interface </span><span style="color: #0000BB">C </span><span style="color: #007700">extends </span><span style="color: #0000BB">A</span><span style="color: #007700">, </span><span style="color: #0000BB">B<br /></span><span style="color: #007700">{<br />    public function </span><span style="color: #0000BB">baz</span><span style="color: #007700">();<br />}<br /><br />class </span><span style="color: #0000BB">D </span><span style="color: #007700">implements </span><span style="color: #0000BB">C<br /></span><span style="color: #007700">{<br />    public function </span><span style="color: #0000BB">foo</span><span style="color: #007700">() {}<br /><br />    public function </span><span style="color: #0000BB">bar</span><span style="color: #007700">() {}<br /><br />    public function </span><span style="color: #0000BB">baz</span><span style="color: #007700">() {}<br /><br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>
  <div class="example" id="language.oop5.interfaces.examples.ex4">
   <p><strong>Пример #6 Интерфейсы с константами</strong></p>
   <div class="example-contents">
<div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br /></span><span style="color: #007700">interface </span><span style="color: #0000BB">A<br /></span><span style="color: #007700">{<br />    const </span><span style="color: #0000BB">B </span><span style="color: #007700">= </span><span style="color: #DD0000">'Константа интерфейса'</span><span style="color: #007700">;<br />}<br /><br /></span><span style="color: #FF8000">// Выведет: Константа интерфейса<br /></span><span style="color: #007700">echo </span><span style="color: #0000BB">A</span><span style="color: #007700">::</span><span style="color: #0000BB">B</span><span style="color: #007700">;<br /><br /><br />class </span><span style="color: #0000BB">B </span><span style="color: #007700">implements </span><span style="color: #0000BB">A<br /></span><span style="color: #007700">{<br />    const </span><span style="color: #0000BB">B </span><span style="color: #007700">= </span><span style="color: #DD0000">'Константа класса'</span><span style="color: #007700">;<br />}<br /><br /></span><span style="color: #FF8000">// Выведет: Константа класса<br />// До PHP 8.1.0 этот код не сработает,<br />// поскольку запрещалось переопределять константы<br /></span><span style="color: #007700">echo </span><span style="color: #0000BB">B</span><span style="color: #007700">::</span><span style="color: #0000BB">B</span><span style="color: #007700">;<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>
  <div class="example" id="language.oop5.interfaces.examples.ex5">
    <p><strong>Пример #7 Интерфейсы с абстрактными классами</strong></p>
     <div class="example-contents">
<div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br /></span><span style="color: #007700">interface </span><span style="color: #0000BB">A<br /></span><span style="color: #007700">{<br />    public function </span><span style="color: #0000BB">foo</span><span style="color: #007700">(</span><span style="color: #0000BB">string $s</span><span style="color: #007700">): </span><span style="color: #0000BB">string</span><span style="color: #007700">;<br /><br />    public function </span><span style="color: #0000BB">bar</span><span style="color: #007700">(</span><span style="color: #0000BB">int $i</span><span style="color: #007700">): </span><span style="color: #0000BB">int</span><span style="color: #007700">;<br />}<br /><br /></span><span style="color: #FF8000">// Абстрактному классу можно реализовывать только часть интерфейса.<br />// Классы, которыми расширяется абстрактный класс, должны реализовать остальные требования интерфейса<br /></span><span style="color: #007700">abstract class </span><span style="color: #0000BB">B </span><span style="color: #007700">implements </span><span style="color: #0000BB">A<br /></span><span style="color: #007700">{<br />    public function </span><span style="color: #0000BB">foo</span><span style="color: #007700">(</span><span style="color: #0000BB">string $s</span><span style="color: #007700">): </span><span style="color: #0000BB">string<br />    </span><span style="color: #007700">{<br />        return </span><span style="color: #0000BB">$s </span><span style="color: #007700">. </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;<br />    }<br />}<br /><br />class </span><span style="color: #0000BB">C </span><span style="color: #007700">extends </span><span style="color: #0000BB">B<br /></span><span style="color: #007700">{<br />    public function </span><span style="color: #0000BB">bar</span><span style="color: #007700">(</span><span style="color: #0000BB">int $i</span><span style="color: #007700">): </span><span style="color: #0000BB">int<br />    </span><span style="color: #007700">{<br />        return </span><span style="color: #0000BB">$i </span><span style="color: #007700">* </span><span style="color: #0000BB">2</span><span style="color: #007700">;<br />    }<br />}<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

   </div>
   <div class="example" id="language.oop5.interfaces.examples.ex6">
    <p><strong>Пример #8 Одновременное расширение класса и реализация интерфейсов</strong></p>
     <div class="example-contents">
<div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br /></span><span style="color: #007700">class </span><span style="color: #0000BB">One<br /></span><span style="color: #007700">{<br />    </span><span style="color: #FF8000">/* ... */<br /></span><span style="color: #007700">}<br /><br />interface </span><span style="color: #0000BB">Usable<br /></span><span style="color: #007700">{<br />    </span><span style="color: #FF8000">/* ... */<br /></span><span style="color: #007700">}<br /><br />interface </span><span style="color: #0000BB">Updatable<br /></span><span style="color: #007700">{<br />    </span><span style="color: #FF8000">/* ... */<br /></span><span style="color: #007700">}<br /><br /></span><span style="color: #FF8000">// Порядок ключевых слов здесь важен. Слово extends должно идти первым<br /></span><span style="color: #007700">class </span><span style="color: #0000BB">Two </span><span style="color: #007700">extends </span><span style="color: #0000BB">One </span><span style="color: #007700">implements<br />    </span><span style="color: #0000BB">Usable</span><span style="color: #007700">,<br />    </span><span style="color: #0000BB">Updatable<br /></span><span style="color: #007700">{<br />    </span><span style="color: #FF8000">/* ... */<br /></span><span style="color: #007700">}<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

   </div>
  <p class="para">
   Интерфейс вместе с объявлениями типов предоставляет надёжный
   способ проверки того, что конкретный объект содержит конкретные
   методы. Смотрите также описание оператора
   <a href="language.operators.type.php" class="link">instanceof</a>
   и раздел «<a href="language.types.declarations.php" class="link">Объявления типов</a>».
  </p>
 </div>

</div><?php manual_footer($setup); ?>