<?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 => 'en',
  ),
  'this' => 
  array (
    0 => 'language.oop5.interfaces.php',
    1 => 'Object Interfaces',
    2 => 'Object Interfaces',
  ),
  'up' => 
  array (
    0 => 'language.oop5.php',
    1 => 'Classes and Objects',
  ),
  'prev' => 
  array (
    0 => 'language.oop5.abstract.php',
    1 => 'Class Abstraction',
  ),
  'next' => 
  array (
    0 => 'language.oop5.traits.php',
    1 => 'Traits',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'en',
    '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">Object Interfaces</h2>
  <p class="para">
   Object interfaces allow you to create code which specifies which methods and properties a
   class must implement, without having to define how these methods or properties are
   implemented.  Interfaces share a namespace with classes, traits, and enumerations, so they may
   not use the same name.
  </p>
  <p class="para">
   Interfaces are defined in the same way as a class, but with the <code class="literal">interface</code>
   keyword replacing the <code class="literal">class</code> keyword and without any of the methods having
   their contents defined.
  </p>
  <p class="para">
   All methods declared in an interface must be public; this is the nature of an
   interface.
  </p>
  <p class="para">
   In practice, interfaces serve two complementary purposes:
  </p>
  <ul class="simplelist">
   <li>
    To allow developers to create objects of different classes that may be used interchangeably
    because they implement the same interface or interfaces.  A common example is multiple database access services,
    multiple payment gateways, or different caching strategies.  Different implementations may
    be swapped out without requiring any changes to the code that uses them.
   </li>
   <li>
    To allow a function or method to accept and operate on a parameter that conforms to an
    interface, while not caring what else the object may do or how it is implemented. These interfaces
    are often named like <code class="literal">Iterable</code>, <code class="literal">Cacheable</code>, <code class="literal">Renderable</code>,
    or so on to describe the significance of the behavior.
   </li>
  </ul>
  <p class="para">
   Interfaces may define
   <a href="language.oop5.magic.php" class="link">magic methods</a> to require implementing classes to
   implement those methods.
  </p>
  <blockquote class="note"><p><strong class="note">Note</strong>: 
   <p class="para">
    Although they are supported, including <a href="language.oop5.decon.php#language.oop5.decon.constructor" class="link">constructors</a>
    in interfaces is strongly discouraged. Doing so significantly reduces the flexibility of the object implementing the
    interface.  Additionally, constructors are not enforced by inheritance rules, which can cause inconsistent
    and unexpected behavior.
   </p>
  </p></blockquote>

  <div class="sect2" id="language.oop5.interfaces.implements">
   <h3 class="title"><code class="literal">implements</code></h3>
   <p class="para">
    To implement an interface, the <code class="literal">implements</code> operator is used.
    All methods in the interface must be implemented within a class; failure to do
    so will result in a fatal error. Classes may implement more than one interface
    if desired by separating each interface with a comma.
   </p>
   <div class="warning"><strong class="warning">Warning</strong>
    <p class="para">
     A class that implements an interface may use a different name for its parameters than
     the interface.  However, as of PHP 8.0 the language supports <a href="functions.arguments.php#functions.named-arguments" class="link">named arguments</a>, which means
     callers may rely on the parameter name in the interface.  For that reason, it is strongly
     recommended that developers use the same parameter names as the interface being implemented.
    </p>
   </div>
   <blockquote class="note"><p><strong class="note">Note</strong>: 
    <p class="para">
     Interfaces can be extended like classes using the <a href="language.oop5.inheritance.php" class="link">extends</a> 
     operator.
    </p>
   </p></blockquote>
   <blockquote class="note"><p><strong class="note">Note</strong>: 
    <p class="para">
     The class implementing the interface must declare all methods in the interface
     with a <a href="language.oop5.basic.php#language.oop.lsp" class="link">compatible signature</a>. A class can implement multiple interfaces
     which declare a method with the same name. In this case, the implementation must follow the
     <a href="language.oop5.basic.php#language.oop.lsp" class="link">signature compatibility rules</a> for all the interfaces. So
     <a href="language.oop5.variance.php" class="link">covariance and contravariance</a> can be applied.
    </p>
   </p></blockquote>
  </div>
 
  <div class="sect2" id="language.oop5.interfaces.constants">
   <h3 class="title">Constants</h3>
   <p class="para">
    It&#039;s possible for interfaces to have constants. Interface constants work exactly 
    like <a href="language.oop5.constants.php" class="link">class constants</a>.
    Prior to PHP 8.1.0, they cannot be overridden by a class/interface that inherits them.
   </p>
  </div>
  <div class="sect2" id="language.oop5.interfaces.properties">
   <h3 class="title">Properties</h3>
   <p class="simpara">
    As of PHP 8.4.0, interfaces may also declare properties.
    If they do, the declaration must specify if the property is to be readable,
    writeable, or both.
    The interface declaration applies only to public read and write access.
   </p>
   <p class="simpara">
    A class may satisfy an interface property in multiple ways.
    It may define a public property.
    It may define a public
    <a href="language.oop5.property-hooks.php#language.oop5.property-hooks.virtual" class="link">virtual property</a>
    that implements only the corresponding hook.
    Or a read property may be satisfied by a <code class="literal">readonly</code> property.
    However, an interface property that is settable may not be <code class="literal">readonly</code>.
   </p>
   <div class="example" id="example-1">
    <p><strong>Example #1 Interface properties example</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">// An implementing class MUST have a publicly-readable property,<br />    // but whether or not it's publicly settable is unrestricted.<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">// An implementing class MUST have a publicly-writeable property,<br />    // but whether or not it's publicly readable is unrestricted.<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">// An implementing class MUST have a property that is both publicly<br />    // readable and publicly writeable.<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">// This class implements all three properties as traditional, un-hooked<br />// properties. That's entirely valid.<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">// This class implements all three properties using just the hooks<br />// that are requested.  This is also entirely valid.<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">// Uses only a get hook to create a virtual property.<br />    // This satisfies the "public get" requirement.<br />    // It is not writeable, but that is not required by the interface.<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">// The interface only requires the property be settable,<br />    // but also including get operations is entirely valid.<br />    // This example creates a virtual property, which is fine.<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">// This property requires both read and write be possible,<br />    // so we need to either implement both, or allow it to have<br />    // the default behavior.<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">Examples</h3>
   <div class="example" id="language.oop5.interfaces.examples.ex1">
    <p><strong>Example #2 Interface example</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">// Declare the interface '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">// Implement the interface<br />// This will work<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">// This will not work<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>Example #3 Extendable Interfaces</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">// This will work<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">// This will not work and result in a 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>Example #4 Variance compatibility with multiple interfaces</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>Example #5 Multiple interface inheritance</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>Example #6 Interfaces with constants</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">// Prints: 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">// Prints: Class constant<br />// Prior to PHP 8.1.0, this will however not work because it was not<br />// allowed to override constants.<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>Example #7 Interfaces with abstract classes</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">// An abstract class may implement only a portion of an interface.<br />// Classes that extend the abstract class must implement the rest.<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>Example #8 Extending and implementing simultaneously</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">// The keyword order here is important. 'extends' must come first.<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">
     An interface, together with type declarations, provides a good way to make sure
     that a particular object contains particular methods. See
     <a href="language.operators.type.php" class="link">instanceof</a> operator and
     <a href="language.types.declarations.php" class="link">type declarations</a>.
   </p>
  </div>

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