Source of: /manual/en/language.oop5.interfaces.php
<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = 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',
),
'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.overloading.php',
1 => 'Overloading',
),
);
$setup["toc"] = $TOC;
$setup["parents"] = $PARENTS;
manual_setup($setup);
manual_header();
?>
<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 interface 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 id="language.oop5.interfaces.implements" class="sect2">
<h3 class="title"><i>implements</i></h3>
<p class="para">
To implement an interface, the <i>implements</i> 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><p><b class="note">Note</b>:
A class cannot implement two interfaces that share function names, since
it would cause ambiguity.
<br />
</p></blockquote>
<blockquote><p><b class="note">Note</b>:
Interfaces can be extended like classes using the <a href="language.oop5.inheritance.php" class="link">extends</a>
operator.
<br />
</p></blockquote>
<blockquote><p><b class="note">Note</b>:
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.
<br />
</p></blockquote>
</div>
<div id="language.oop5.interfaces.constants" class="sect2">
<h3 class="title"><i>Constants</i></h3>
<p class="para">
Its possible for interfaces to have constants. Interface constants works exactly
like <a href="language.oop5.constants.php" class="link">class constants</a>. They cannot
be overridden by a class/interface that inherits it.
</p>
</div>
<div id="language.oop5.interfaces.examples" class="sect2">
<h3 class="title">Examples</h3>
<div class="example">
<p><b>Example #1 Interface example</b></p>
<div class="example-contents programlisting">
<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">
<p><b>Example #2 Extendable Interfaces</b></p>
<div class="example-contents programlisting">
<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">
<p><b>Example #3 Multiple interface inheritance</b></p>
<div class="example-contents programlisting">
<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">
<p><b>Example #4 Interfaces with constants</b></p>
<div class="example-contents programlisting">
<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 its not allowed to <br />// override constants. This is the same concept as with <br />// class 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.php" class="link">instanceof</a> operator and
<a href="language.oop5.typehinting.php" class="link">type hinting</a>.
</p>
</div>
</div><?php manual_footer(); ?>