<?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 => 'ja',
  ),
  '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' => 'ja',
    '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">class</code> のかわりに <code class="literal">interface</code>
  を用います。またメソッドの実装は全く定義しません。
 </p>
 <p class="para">
  インターフェイス内で宣言される全てのメソッドは public である必要があります。
  これは、インターフェイスの特性によります。
 </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>
     に従わなければいけません。
     そうすることで、<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">プロパティ</h3>
   <p class="simpara">
    PHP 8.4.0 から、インターフェイスはプロパティを宣言できるようになりました。
    宣言する場合、そのプロパティの読み取り可否、書き込み可否、あるいは双方を
    指定する必要があります。
    インターフェイスによる宣言は、public な読み書きに対してのみ適用できます。
   </p>
   <p class="simpara">
    クラス側でインターフェイスのプロパティ要件を満たすには、
    public な通常のプロパティを定義する、
    対応するフックを実装する public な
    <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 /></span><span style="color: #007700">interface </span><span style="color: #0000BB">I<br /></span><span style="color: #007700">{<br />    </span><span style="color: #FF8000">// 実装クラスは、public に読み取り可能なプロパティを持つ必要があります。<br />    // public に書き込み可能かどうかは制限されません。<br />    </span><span style="color: #007700">public </span><span style="color: #0000BB">string $readable </span><span style="color: #007700">{ </span><span style="color: #0000BB">get</span><span style="color: #007700">; }<br /><br />    </span><span style="color: #FF8000">// 実装クラスは、public に書き込み可能なプロパティを持つ必要があります。<br />    // public に読み取り可能かどうかは制限されません。<br />    </span><span style="color: #007700">public </span><span style="color: #0000BB">string $writeable </span><span style="color: #007700">{ </span><span style="color: #0000BB">set</span><span style="color: #007700">; }<br /><br />    </span><span style="color: #FF8000">// 実装クラスは、public に読み書き可能なプロパティを持つ必要があります。<br />    </span><span style="color: #007700">public </span><span style="color: #0000BB">string $both </span><span style="color: #007700">{ </span><span style="color: #0000BB">get</span><span style="color: #007700">; </span><span style="color: #0000BB">set</span><span style="color: #007700">; }<br />}<br /><br /></span><span style="color: #FF8000">// このクラスは、3つのプロパティをすべてフックのない通常のプロパティとして実装しています。<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">// このクラスは、3つのプロパティすべてを、要求されたフックのみを使って実装しています。<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">// get フックのみ使い仮想プロパティを作成しています。<br />    // 「public に読み取り可能」という要件を満たします。<br />    // 書き込みはできませんが、インターフェイスからは要求されていません。<br />    </span><span style="color: #007700">public </span><span style="color: #0000BB">string $readable </span><span style="color: #007700">{ </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 />    </span><span style="color: #FF8000">// インターフェイスはこのプロパティが「書き込み可能」であることのみ要求しています。<br />    // ここに get の動作も含めることは全く問題ありません。<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 />        </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">// このプロパティは「public に読み書き可能」でなければならないため、<br />    // get と set の両方を実装する必要があります。<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 />        </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 /></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 /></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 /></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 /></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 />    }<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 />}<br /><br /></span><span style="color: #FF8000">// これは動作せず、fatal error となります。<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 />    }<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 />}<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 /></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 </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 </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 /></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 /></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 />    }<br /><br />    public function </span><span style="color: #0000BB">bar</span><span style="color: #007700">()<br />    {<br />    }<br /><br />    public function </span><span style="color: #0000BB">baz</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.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 /></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">'Interface constant'</span><span style="color: #007700">;<br />}<br /><br /></span><span style="color: #FF8000">// Interface constant と表示します。<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">'Class constant'</span><span style="color: #007700">;<br />}<br /><br /></span><span style="color: #FF8000">// Class constant と表示します。<br />// PHP 8.1.0 より前のバージョンでは、定数をオーバライドできなかったため、これは動作しませんでした。<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 /></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 /></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 /></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">// ここでは、キーワードの順番が重要です。<br />// '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 </span><span style="color: #0000BB">Usable</span><span style="color: #007700">, </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 /></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); ?>