/php/language.oop5.interfaces.html
HTML | 100 lines | 94 code | 6 blank | 0 comment | 0 complexity | f863a8433cded135f25227a753fd59fc MD5 | raw file
- <!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>接口</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">抽象类</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">类与对象</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">接口</h2>
- <p class="para">
- 使用接口(interface),你可以指定某个类必须实现哪些方法,但不需要定义这些方法的具体内容。
- </p>
- <p class="para">
- 我们可以通过interface来定义一个接口,就像定义一个标准的类一样,但其中定义所有的方法都是空的。
- </p>
- <p class="para">
- 接口中定义的所有方法都必须是public,这是接口的特性。
- </p>
- <div class="sect2" id="language.oop5.interfaces.implements">
- <h3 class="title"><em>实现</em></h3>
- <p class="para">
- 要实现一个接口,可以使用<em>implements</em>操作符。类中必须实现接口中定义的所有方法,否则
- 会报一个fatal错误。如果要实现多个接口,可以用逗号来分隔多个接口的名称。
- </p>
- <blockquote class="note"><p><strong class="note">Note</strong>:
- <p class="para">
- 实现多个接口时,接口中的方法不能有重名。
- </p>
- </p></blockquote>
- <blockquote class="note"><p><strong class="note">Note</strong>:
- <p class="para">
- 接口也可以继承,通过使用<em>extends</em>操作符。
- </p>
- </p></blockquote>
- </div>
- <div class="sect2" id="language.oop5.interfaces.constants">
- <h3 class="title"><em>常量</em></h3>
- <p class="para">
- 接口中也可以定义常量。接口常量和<a href="language.oop5.constants.html" class="link">类常量</a>的使用完全相同。
- 它们都是定值,不能被子类或子接口修改。
- </p>
- </div>
- <div class="sect2" id="language.oop5.interfaces.examples">
- <h3 class="title">范例</h3>
- <div class="example" id="language.oop5.interfaces.examples.ex1">
- <p><strong>Example #1 接口代码示例</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">// 声明一个'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 /><br /></span><span style="color: #FF8000">// 实现接口<br />// 下面的写法是正确的<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">// 下面的写法是错误的,会报错:<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">// 正确写法<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">?></span>
- </span>
- </code></div>
- </div>
- </div>
- <div class="example" id="language.oop5.interfaces.examples.ex3">
- <p><strong>Example #3 多个接口间的继承</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 使用接口常量</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">// 输出接口常量<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">// 错误写法,因为常量的值不能被修改。接口常量的概念和类常量是一样的。<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="simpara">
- 你也可以看看<a href="language.operators.type.html" class="link">instanceof</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">抽象类</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">类与对象</a></div>
- <div class="home"><a href="index.html">PHP Manual</a></div>
- </div></body></html>