原文:https://blog.csdn.net/qq_19557947/article/details/77880757?locationNum=4&fps=1
PHP類
PHP類是單繼承,也就是不支持多繼承,當一個類需要多個類的功能時,繼承就無能為力了
abstract
用abstract修飾的類表示這個類是一個抽象類,用abstract修飾的方法表示這個方法是一個抽象方法。
抽象方法是只有方法聲明,而沒有方法的實現內容。
抽象類不能被實例化,通常是將抽象方法做為子類方法重寫使用的,且要把繼承的抽象類里的方法都實現。
abstract class AbstractClass{ //定義抽象方法 abstract protected function getValue(); //普通方法 public function printOut(){ echo $this->getValue(); } } class CommonClass extends AbstractClass{ protected function getValue(){ return "抽象方法的實現"; } } $class1 = new CommonClass(); $class1->printOut();
extends
extends是繼承某個類,繼承之后可以使用父類的方法,也可以重寫父類的方法,
如果類被聲明為final,則不能被繼承。
implements
implements是實現多個接口,接口的方法一般為空,必須重寫才能使用
interface
如果一個抽象類里的所有方法都是抽象方法,且沒有聲明變量,所有成員都是public權限,那么這種特殊的抽象類就叫 接口
interface即PHP接口,並用關鍵字implements來實現接口中方法,且必須完全實現。
例:
//定義接口 interface User{ function getDiscount(); function getUserType(); } //VIP用戶 接口實現 class VipUser implements User{ //VIP用戶折扣系數 private $discount = 0.8; function getDiscount(){ return $this->discount; } function getUserType(){ return 'VIP'; } } class Goods{ var $price =100; var $vc; //定義User接口類型參數,這時並不知道是什么用戶 function run(User $vc){ $this->vc=$vc; $discount = $this->vc->getDiscount(); $usertype = $this->vc->getUserType(); echo $usertype.'商品價格:'.$this->pirce*$discount; } } $display = new Goods(); $display->run(new VipUser());
輸出:VIP商品價格:80
該例子中,User接口中實現用戶的折扣,而在VipUser類里面實現了具體的折扣系數,最后商品類Goods根據user接口來實現不同用戶報價
實現多個接口
PHP也可以在繼承一個類的時候同時實現多個接口
class 子類 extends 父類 implements 接口1,接口2,... { ...... }
抽象類和接口的區別
接口是一個特殊的抽象類,也可以看作是一個模型的規范,接口與抽象類大致區別如下:
1,一個子類如果implements一個接口,就必須實現接口中的所有方法(不管是否需要);如果是繼承一個抽象類,只需要實現需要的方法即可
2,如果一個接口中定義的方法名改變了,那么所有市縣次接口的子類需要同更新方法名,而抽象類中如果方法名改變了,其子類對應的方法名將不受影響,只是變成了一個新的方法而已
3,抽象類只能單繼承,當一個子類需要實現的功能需要集成多個父類,就必須適用接口。