PHP的類,abstract類,interface及關鍵字extends和implements


原文: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,抽象類只能單繼承,當一個子類需要實現的功能需要集成多個父類,就必須適用接口。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM