<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <title>Object Interfaces</title> </head> <body><div class="manualnavbar" style="text-align: center;"> <div class="prev" style="text-align: left; float: left;"><a href="language.oop5.abstract.html">Class Abstraction</a></div> <div class="next" style="text-align: right; float: right;"><a href="language.oop5.traits.html">Traits</a></div> <div class="up"><a href="language.oop5.html">Classes and Objects</a></div> <div class="home"><a href="index.html">PHP Manual</a></div> </div><hr /><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 a class must implement, without having to define how these methods are handled. </p> <p class="para"> Interfaces are defined using the <em>interface</em> keyword, in the same way as a standard class, but 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> <div class="sect2" id="language.oop5.interfaces.implements"> <h3 class="title"><em>implements</em></h3> <p class="para"> To implement an interface, the <em>implements</em> 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> <blockquote class="note"><p><strong class="note">Note</strong>: <p class="para"> Prior to PHP 5.3.9, a class could not implement two interfaces that specified a method with the same name, since it would cause ambiguity. More recent versions of PHP allow this as long as the duplicate methods have the same signature. </p> </p></blockquote> <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.html" 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 use the exact same method signatures as are defined in the interface. Not doing so will result in a fatal error. </p> </p></blockquote> </div> <div class="sect2" id="language.oop5.interfaces.constants"> <h3 class="title"><em>Constants</em></h3> <p class="para"> It's possible for interfaces to have constants. Interface constants works exactly like <a href="language.oop5.constants.html" class="link">class constants</a> except they cannot be overridden by a class/interface that inherits them. </p> </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 #1 Interface example</strong></p> <div class="example-contents"> <div class="phpcode"><code><span style="color: #000000"> <span style="color: #0000BB"><?php<br /><br /></span><span style="color: #FF8000">// Declare the interface 'iTemplate'<br /></span><span style="color: #007700">interface </span><span style="color: #0000BB">iTemplate<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">Template </span><span style="color: #007700">implements </span><span style="color: #0000BB">iTemplate<br /></span><span style="color: #007700">{<br /> private </span><span style="color: #0000BB">$vars </span><span style="color: #007700">= array();<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">-></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">-></span><span style="color: #0000BB">vars </span><span style="color: #007700">as </span><span style="color: #0000BB">$name </span><span style="color: #007700">=> </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 (iTemplate::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">iTemplate<br /></span><span style="color: #007700">{<br /> private </span><span style="color: #0000BB">$vars </span><span style="color: #007700">= array();<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">-></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">?></span> </span> </code></div> </div> </div> <div class="example" id="language.oop5.interfaces.examples.ex2"> <p><strong>Example #2 Extendable Interfaces</strong></p> <div class="example-contents"> <div class="phpcode"><code><span style="color: #000000"> <span style="color: #0000BB"><?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">?></span> </span> </code></div> </div> </div> <div class="example" id="language.oop5.interfaces.examples.ex3"> <p><strong>Example #3 Multiple interface inheritance</strong></p> <div class="example-contents"> <div class="phpcode"><code><span style="color: #000000"> <span style="color: #0000BB"><?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">?></span> </span> </code></div> </div> </div> <div class="example" id="language.oop5.interfaces.examples.ex4"> <p><strong>Example #4 Interfaces with constants</strong></p> <div class="example-contents"> <div class="phpcode"><code><span style="color: #000000"> <span style="color: #0000BB"><?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 /></span><span style="color: #FF8000">// This will however not work because it's not allowed to <br />// override constants.<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">'Class constant'</span><span style="color: #007700">;<br />}<br /></span><span style="color: #0000BB">?></span> </span> </code></div> </div> </div> <p class="para"> An interface, together with type-hinting, provides a good way to make sure that a particular object contains particular methods. See <a href="language.operators.type.html" class="link">instanceof</a> operator and <a href="language.oop5.typehinting.html" class="link">type hinting</a>. </p> </div> </div><hr /><div class="manualnavbar" style="text-align: center;"> <div class="prev" style="text-align: left; float: left;"><a href="language.oop5.abstract.html">Class Abstraction</a></div> <div class="next" style="text-align: right; float: right;"><a href="language.oop5.traits.html">Traits</a></div> <div class="up"><a href="language.oop5.html">Classes and Objects</a></div> <div class="home"><a href="index.html">PHP Manual</a></div> </div></body></html>