php抽象 与接口
抽象方法和抽象類
PHP5支持抽象類和抽象方法。抽象類不能直接被實例化,你必須先繼承該抽象類,然后再實例化子類。抽象類中 至少要包含一個抽象方法。如果類方法被聲明為抽象的,那么其中就不能包括具體的功能實現(xiàn)。
繼承一個抽象類的時候,子類必須實現(xiàn)抽象類中的所有抽象方法;另外,這些方法的可見性 必須和抽象類中一樣(或者更為寬松)。如果抽象類中某個抽象方法被聲明為protected,那么子類中實現(xiàn)的方法就應(yīng)該聲明為protected或者public,而不 能定義為private。
定義
什么是抽象方法?我們在類里面定義的沒有方法體的方法就是抽象方法,所謂的沒有方法體指的是,在方法聲明的時候沒有大括號以及其中的內(nèi)容,而是直接在聲明時在方法名后加上分號結(jié)束,另外在聲明抽象方法時還要加一個關(guān)鍵字“abstract”來修飾;
abstract function fun1(); abstract function fun2();?
那么什么是抽象類呢?只要一個類里面有一個方法是抽象方法,那么這個類就要定義為抽象類,抽象類也要使用“abstract”關(guān)鍵字來修飾;在抽象類里面 可以有不是抽象的方法和成員屬性,但只要有一個方法是抽象的方法,這個類就必須聲明為抽象類,使用”abstract”來修飾
abstract class Demo {var $test;abstract function fun1();abstract function fun2();function fun3(){... ...} }?上例中定義了一個抽象類“Demo”使用了”abstract”來修飾, 在這個類里面定義了一個成員屬性“$test”,和兩個抽象方法“fun1”和“fun2”還有一個非抽象的方法fun3();那么抽象類我們怎么使用 呢?最重要的一點就是抽象類不能產(chǎn)生實例對象,所以也不能直接使用,前面我們多次提到過類不能直接使用,我們使用的是通過類實例化出來的對象,那么抽象類 不能產(chǎn)生實例對象我們聲明抽象類有什么用呢?我們是將抽象方法是做為子類重載的模板使用的,定義抽象類就相當(dāng)于定義了一種規(guī)范,這種規(guī)范要求子類去遵守, 子類繼函抽象類之后,把抽象類里面的抽象方法按照子類的需要實現(xiàn)。子類必須把父類中的抽象方法全部都實現(xiàn),否則子類中還存在抽象方法,那么子類還是抽象 類,還是不能實例化對;為什么我們非要從抽象類中繼承呢?因為有的時候我們要實現(xiàn)一些功能就必須從抽象類中繼承,否則這些功能你就實現(xiàn)不了,如果繼承了抽 象類,就要實現(xiàn)類其中的抽象方法;
$demo=new Demo();class Test extends Demo {function fun1(){... ...}function fun2(){... ...} }?
PHP 接口
PHP 類是單繼承,也就是不支持多繼承,當(dāng)一個類需要多個類的功能時,繼承就無能為力了,為此 PHP 引入了類的接口技術(shù)。
如果一個抽象類里面的所有方法都是抽象方法,且沒有聲明變量,而且接口里面所有的成員都是 public 權(quán)限的,那么這種特殊的抽象類就叫 接口 。
接口使用關(guān)鍵字 interface 來定義,并使用關(guān)鍵字 implements 來實現(xiàn)接口中的方法,且必須完全實現(xiàn)。
例子:
<?php// 聲明一個'iTemplate'接口 interface iTemplate {public function setVariable($name, $var);public function getHtml($template); }// 實現(xiàn)接口 // 下面的寫法是正確的 class Template implements iTemplate {private $vars = array();public function setVariable($name, $var){$this->vars[$name] = $var;}public function getHtml($template){foreach($this->vars as $name => $value) {$template = str_replace('{' . $name . '}', $value, $template);}return $template;} }// 下面的寫法是錯誤的,會報錯: // Fatal error: Class BadTemplate contains 1 abstract methods // and must therefore be declared abstract (iTemplate::getHtml) class BadTemplate implements iTemplate {private $vars = array();public function setVariable($name, $var){$this->vars[$name] = $var;} } ?>?
實現(xiàn)多個接口
PHP也可以在繼承一個類的時候同時實現(xiàn)多個接口:
class 子類 extends 父類 implemtns 接口1, 接口2, ... {...... }<?php interface a {public function foo(); }interface b {public function bar(); }interface c extends a, b {public function baz(); }class d implements c {public function foo(){}public function bar(){}public function baz(){} } ?>
抽象類和接口的區(qū)別
接口是特殊的抽象類,也可以看做是一個模型的規(guī)范。接口與抽象類大致區(qū)別如下:
?
?轉(zhuǎn)載于:https://www.cnblogs.com/zoubizhici/p/5570224.html
總結(jié)
- 上一篇: spirng mvc 中使用验证码
- 下一篇: 02:陶陶摘苹果