<?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 => 'es',
  ),
  'this' => 
  array (
    0 => 'language.oop5.interfaces.php',
    1 => 'Interfaces',
    2 => 'Interfaces',
  ),
  'up' => 
  array (
    0 => 'language.oop5.php',
    1 => 'Clases y objetos',
  ),
  'prev' => 
  array (
    0 => 'language.oop5.abstract.php',
    1 => 'Abstracci&oacute;n de clases',
  ),
  'next' => 
  array (
    0 => 'language.oop5.traits.php',
    1 => 'Traits',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'es',
    '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">Interfaces</h2>
  <p class="para">
   Las interfaces de objetos permiten crear código que especifica qué métodos y propiedades una
   clase debe implementar, sin tener que definir cómo se implementan estos métodos o propiedades. Las interfaces comparten un espacio de nombres con las clases, traits y enumeraciones, de modo que no pueden
   utilizar el mismo nombre.
  </p>
  <p class="para">
   Las interfaces se definen de la misma manera que una clase, pero utilizando la palabra clave <code class="literal">interface</code> en lugar de
   <code class="literal">class</code>, y sin que ninguno de los métodos tenga su contenido
   especificado.
  </p>
  <p class="para">
   Por la naturaleza misma de una interfaz, todos los métodos declarados en una
   interfaz deben ser públicos.
  </p>
  <p class="para">
   En la práctica, las interfaces sirven dos roles complementarios:
  </p>
  <ul class="simplelist">
   <li>
    Permitir a los desarrolladores crear objetos de clases diferentes
    que pueden ser utilizados de manera intercambiable, ya que implementan
    la o las mismas interfaces. Un ejemplo común son varios servicios
    de acceso a bases de datos, varios gestores de pago o
    diferentes estrategias de caché. Diferentes implementaciones pueden ser
    intercambiadas sin necesitar cambios en el código que las utiliza.
   </li>
   <li>
    Para permitir que una función o método acepte y opere sobre un
    argumento que se ajuste a una interfaz, sin preocuparse de qué más
    puede hacer el objeto o cómo está implementado. Estas interfaces suelen
    llamarse <code class="literal">Iterable</code>, <code class="literal">Cacheable</code>, <code class="literal">Renderable</code>,
    etc. para describir el significado de su comportamiento.
   </li>
  </ul>
  <p class="para">
   Las interfaces pueden definir
   <a href="language.oop5.magic.php" class="link">métodos mágicos</a> para obligar
   a las clases que las implementan a implementar estos métodos.
  </p>
  <blockquote class="note"><p><strong class="note">Nota</strong>: 
   <p class="para">
    Aunque esto es soportado, incluir los
    <a href="language.oop5.decon.php#language.oop5.decon.constructor" class="link">constructores</a>
    en las interfaces está fuertemente desaconsejado. Hacerlo reduce
    radicalmente la flexibilidad de los objetos que implementan la interfaz.
    Además, los constructores no están sujetos a las reglas de herencia,
    lo que puede causar incoherencias y comportamientos inesperados.
   </p>
  </p></blockquote>

  <div class="sect2" id="language.oop5.interfaces.implements">
   <h3 class="title"><code class="literal">implements</code></h3>
   <p class="para">
    Para implementar una interfaz, se utiliza el operador <code class="literal">implements</code>.
    Todos los métodos de la interfaz deben ser implementados en una
    clase; si no es así, se emitirá un error fatal. Las clases pueden
    implementar más de una interfaz, separando cada interfaz por una coma.
   </p>
   <div class="warning"><strong class="warning">Advertencia</strong>
    <p class="para">
     Una clase que implementa una interfaz puede utilizar nombres diferentes
     para sus argumentos que la interfaz. Sin embargo, a partir de PHP 8.0, el
     lenguaje soporta los
     <a href="functions.arguments.php#functions.named-arguments" class="link">argumentos nombrados</a>, lo que
     significa que el llamador puede depender del nombre del argumento en la interfaz.
     Por esta razón, se recomienda encarecidamente que los desarrolladores
     utilicen el mismo nombre de argumento que en la interfaz que se implementa.
    </p>
   </div>
   <blockquote class="note"><p><strong class="note">Nota</strong>: 
    <p class="para">
     Las interfaces pueden ser extendidas como clases, utilizando el operador
     <a href="language.oop5.inheritance.php" class="link">extends</a>
    </p>
   </p></blockquote>
   <blockquote class="note"><p><strong class="note">Nota</strong>: 
    <p class="para">
     La clase que implementa la interfaz debe declarar todos los métodos en
     la interfaz con una <a href="language.oop5.basic.php#language.oop.lsp" class="link">firma compatible</a>.
     Una clase puede implementar dos interfaces que definan un método
     con el mismo nombre. En este caso, la implementación debe seguir las
     <a href="language.oop5.basic.php#language.oop.lsp" class="link">reglas de compatibilidad de firmas</a>
     para todas las interfaces. Así,
     <a href="language.oop5.variance.php" class="link">la covarianza y la contravarianza</a>
     pueden ser aplicadas.
    </p>
   </p></blockquote>
  </div>
  <div class="sect2" id="language.oop5.interfaces.constants">
   <h3 class="title">Las constantes</h3>
   <p class="para">
    Las interfaces pueden contener constantes. Las constantes de interfaces
    funcionan exactamente como las
    <a href="language.oop5.constants.php" class="link">constantes de clase</a>.
    Anterior a PHP 8.1.0, no pueden ser redefinidas por una
    clase/interfaz que las hereda.
   </p>
  </div>
  <div class="sect2" id="language.oop5.interfaces.properties">
   <h3 class="title">Propiedades</h3>
   <p class="simpara">
    A partir de PHP 8.4.0, las interfaces también pueden declarar propiedades.
    Si lo hacen, la declaración debe especificar si la propiedad es legible,
    modificable, o ambas.
    La declaración de la interfaz se aplica únicamente al acceso en lectura y escritura públicos.
   </p>
   <p class="simpara">
    Una clase puede satisfacer una propiedad de interfaz de varias maneras.
    Puede definir una propiedad pública.
    Puede definir una propiedad pública
    <a href="language.oop5.property-hooks.php#language.oop5.property-hooks.virtual" class="link">virtual</a>
    que implemente únicamente el crochet correspondiente.
    O una propiedad de lectura puede ser satisfecha por una propiedad <code class="literal">readonly</code>.
    Sin embargo, una propiedad de interfaz que es modificable no puede ser <code class="literal">readonly</code>.
   </p>
   <div class="example" id="example-1">
    <p><strong>Ejemplo #1 Ejemplo de propiedades de interfaz</strong></p>
    <div class="example-contents">
<div class="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">// Una clase que implementa esta interfaz DEBE tener una propiedad públicamente legible,<br />    // pero que esta sea o no modificable públicamente no está restringido.<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">// Una clase que implementa esta interfaz DEBE tener una propiedad públicamente modificable,<br />    // pero que esta sea o no legible públicamente no está restringido.<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">// Una clase que implementa esta interfaz DEBE tener una propiedad que sea a la vez públicamente<br />    // legible y públicamente modificable.<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">// Esta clase implementa las tres propiedades como propiedades tradicionales, sin crochets.<br />// Esto es completamente válido.<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">// Esta clase implementa las tres propiedades utilizando únicamente los crochets<br />// solicitados. Esto también es completamente válido.<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">// Utiliza únicamente un crochet get para crear una propiedad virtual.<br />    // Esto satisface el requisito "get public".<br />    // No es modificable, pero esto no es requerido por la interfaz.<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">// La interfaz requiere únicamente que la propiedad sea modificable,<br />    // pero incluir operaciones get también es completamente válido.<br />    // Este ejemplo crea una propiedad virtual, lo cual es aceptable.<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">// Esta propiedad requiere que la lectura y la escritura sean posibles,<br />    // por lo que debemos implementar ambas o permitir el comportamiento por defecto.<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">Ejemplos</h3>
   <div class="example" id="language.oop5.interfaces.examples.ex1">
   <p><strong>Ejemplo #2 Ejemplo de interfaz</strong></p>
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br /></span><span style="color: #FF8000">// Declaración de la interfaz '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">// Implementación de la interfaz<br />// Esto funcionará<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">// Esto no funcionará<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>Ejemplo #3 Las interfaces extensibles</strong></p>
     <div class="example-contents">
<div class="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">// Esto funcionará<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">// Esto no funcionará y resultará en un error fatal<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>Ejemplo #4 Compatibilidad de la varianza con múltiples interfaces</strong></p>
     <div class="example-contents">
<div class="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>Ejemplo #5 Herencia de múltiples interfaces</strong></p>
     <div class="example-contents">
<div class="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>Ejemplo #6 Interfaces con constantes</strong></p>
     <div class="example-contents">
<div class="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">'Constante de la interfaz'</span><span style="color: #007700">;<br />}<br /><br /></span><span style="color: #FF8000">// Muestra: Constante de la interfaz<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 /></span><span style="color: #FF8000">// Sin embargo, esto no funcionará, ya que no está permitido<br />// sobrescribir constantes.<br /></span><span style="color: #007700">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">'Constante de clase'</span><span style="color: #007700">;<br />}<br /><br /></span><span style="color: #FF8000">// Muestra: Constante de clase<br />// Anterior a PHP 8.1.0, esto no funcionaría, ya que no estaba permitido<br />// redefinir constantes.<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>Ejemplo #7 Las interfaces con las clases abstractas</strong></p>
    <div class="example-contents">
<div class="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">// Una clase abstracta puede implementar solo una parte de una interfaz.<br />// Las clases que extienden la clase abstracta deben implementar el resto.<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>Ejemplo #8 Extendiendo e implementando simultáneamente</strong></p>
    <div class="example-contents">
<div class="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">// El orden de las palabras clave aquí es importante. 'extends' debe ir primero.<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">
    Una interfaz, con las declaraciones de tipos, proporciona una buena manera
    de asegurarse de que un objeto particular contiene métodos particulares.
    Ver el operador <a href="language.operators.type.php" class="link">instanceof</a> y
    las <a href="language.types.declarations.php" class="link">declaraciones de tipo</a>.
   </p>
 </div>

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