本文實(shí)例講述了PHP抽象類與接口的區(qū)別。分享給大家供大家參考,具體如下:
抽象類abstract
概念
定義為抽象的類不能被實(shí)例化。任何一個(gè)類,如果有一個(gè)方法是被聲明為抽象的,那么這個(gè)類就必須被聲明為抽象的類。
繼承一個(gè)抽象類的時(shí)候,子類必須定義父類中的所有抽象方法,這些方法的訪問(wèn)控制必須喝父類中一樣或者更為寬松。
例如,某個(gè)抽象方法被聲明為proteced,那么子類中的實(shí)現(xiàn),就應(yīng)該聲明為protected或者public,而不能定義為private。
方法的調(diào)用方式必須匹配,即類型和所需參數(shù)數(shù)量必須一致,例如,子類定義了一個(gè)可選參數(shù),而父類抽象方法中沒(méi)有聲明,則兩者的聲明并沒(méi)有沖突。
特點(diǎn)
示例
示例一
<?php// 抽象類abstract class AbstractClasss{ // 強(qiáng)制要求子類定義這些方法 abstract protected function getValue(); abstract protected function prefixValue(); // 普通方法(非抽象方法) public function printOut() { print $this->getValue() . "/n"; }}// 子類class ConcreteClassOne extends AbstractClass{ protected function getValue() { return "ConcreteClassOne"; } public function prefixValues($prefix) { return "{$prefix}ConcreteClassOne"; }}// 子類class ConcreteClassTwo extends AbstractClass{ protected function getValue() { return "ConcreteClassTwo"; } public function prefixValue($prefix) { return "{$prefix}ConcreteClassTwo"; }}// 實(shí)例化第一個(gè)子類$classOne = new ConcreteClassOne;$classOne->printOut();echo $classOne->prefixValue('FOO_') . "/n";// 實(shí)例化第二個(gè)子類$classTwo = new ConcreteClassTwo;$classTwo->printOut();echo $classTwo->prefixValue('FOO_') . "/n";結(jié)果輸出
ConcreteClassOne
FOO_ConcreteClassOneConcreteClassTwo
FOO_ConcreteClassTwo
示例二
<?php// 抽象類abstract class AbstractClass{ // 我們的抽象方法僅需要定義需要的參數(shù) abstract protected function prefixName($name);}// 子類class ConcreteClass extends AbstractClass{ // 我們的子類可以定義父類簽名中不存在的可選參數(shù) public function prefixName($name, $separator = ".") { if ($name == "Pacman") { $prefix = "Mr"; } elseif ($name == "Pacwoman") { $prefix = "Mrs"; } else { $prefix = ""; } return "{$prefix}{$separator} {$name}"; }}// 實(shí)例化子類$class = new ConcreteClass;echo $class->prefixName("Pacman") . "/n";echo $class->prefixName("Pacwoman") . "/n";結(jié)果輸出
Mr. Pacman
Mrs, Pacwoman
接口interface
概念
使用接口interface,可以指定某個(gè)類必須實(shí)現(xiàn)那些方法,但是不需要定義這些方法的具體內(nèi)容。
要實(shí)現(xiàn)一個(gè)接口,使用implements操作符,類中必須實(shí)現(xiàn)接口中定義的所有方法。
特點(diǎn)
示例
示例一 、 實(shí)現(xiàn)接口
<?php// 聲明一個(gè)iTemplate接口interface iTemplate{ public function setVariable($name, $var); public function getHtml($template);}// 實(shí)現(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; }}// 下面的寫法是錯(cuò)誤的,會(huì)報(bào)錯(cuò),因?yàn)闆](méi)有實(shí)現(xiàn) getHtml()// Fatal error: Class BadTemplate contains 1 abstract methonds// and must therefore be declared abstaract (iTemplate::getHtml)class BadTemplate implements iTemplate{ private $vars = array(); public function setVariable($name, $var) { $this->vars[$name] = $var; }}示例二 、 可擴(kuò)充接口
<?phpinterface a{ public function foo();}interface b extends a{ public function baz(Baz $baz);}// 正確的寫法class c implements b{ public function foo() { } public function baz(Baz $baz) { }}// 錯(cuò)誤的寫法會(huì)導(dǎo)致一個(gè)致命的錯(cuò)誤class d implements b{ public function foo() { } public function baz(Foo $foo) { }}示例三 、 繼承多個(gè)接口
<?phpinterface 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() { }}示例四 、使用接口常量
<?phpinterface a{ const b = 'Interface constant';}// 輸出接口變量echo a:b;// 錯(cuò)誤的寫法,因?yàn)槌A坎荒鼙桓采w。// 接口常量的概念和類常量的是一樣的。class b implements a{ const b = 'Class constant'}希望本文所述對(duì)大家PHP程序設(shè)計(jì)有所幫助。
新聞熱點(diǎn)
疑難解答
圖片精選