php中關鍵字interface和implements詳解

來源:互聯網
上載者:User
PHP 類是單繼承,也就是不支援多繼承,當一個類需要多個類的功能時,繼承就無能為力了,為此 PHP 引入了類的介面技術。下面這篇文章主要跟大家介紹了關於PHP中關鍵字interface和implements的相關資料,需要的朋友可以參考借鑒,下面來一起看看吧。

PHP 介面

PHP 類是單繼承,也就是不支援多繼承,當一個類需要多個類的功能時,繼承就無能為力了,為此 PHP 引入了類的介面技術。

如果一個抽象類別裡面的所有方法都是抽象方法,且沒有聲明變數,而且介面裡面所有的成員都是 public 許可權的,那麼這種特殊的抽象類別就叫 介面 。

介面使用關鍵字 interface 來定義,並使用關鍵字 implements 來實現介面中的方法,且必須完全實現。

類中介面的應用

1.關鍵字:interface

2.關鍵字:implements

1.介面的介紹與建立

介面:一種成員屬性全部為抽象或常量的特殊抽象類別。

規則:

1.類中全部為抽象方法。

2.抽象方法錢不用加abstract。

3.介面抽象方法屬性為public。

4.成員屬性必須為常量。

格式代碼如下:

interface demo { const NAME = "常量對象屬性"; function fun1(); function fun2(); //抽象方法。 }

2.介面的應用與規範

介面引用區別於類繼承關鍵字 extends ,繼承只能只是單一性,而介面可以使用關鍵字 implements 多個引用並用逗號分開

1.格式:普通類引用介面

class MyPc implements demo , demo2 , demo3 { ... }

2.格式:抽象類別應用介面例子

abstract class MyPc implements demo , demo2 , demo3 { ... }

3.格式:繼承父類引用介面並存

class MyPc extends Root implements demo , demo2 , demo3 { ... }

先繼承後介面,單繼承多介面。

4.格式:介面與介面的繼承

interface demo3 extends demo { ... }

執行個體代碼如下:

<?php interface demo {  const NAME = "名稱";  function fun1();  function fun2(); } interface demo2 {  function fun3();  function fun4(); } interface demo3 {  const TEST = "Test";  function fun5(); } class MyPc implements demo, demo2 {  function fun1() {  echo "++++++++++<br />";  }  function fun2() {  echo "----------<br />";  }  function fun3() {  echo "1111111111<br />";  }  function fun4() {  echo "2222222222<br />";  } } class MyPs extends MyPc implements demo3 {  function fun5() {  echo "繼承類後引用介面";  } } $p = new MyPs; $p->fun1(); $p->fun2(); $p->fun3(); $p->fun4(); $p->fun5(); ?>

例,介面使用關鍵字 interface 來定義,並使用關鍵字 implements 來實現介面中的方法,且必須完全實現。

執行個體代碼如下:

<?php //定義介面 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->price*$discount;  } } $display = new Goods(); $display ->run(new VipUser); //可以是更多其他使用者類型 ?>

運行該例子,輸出:

VIP使用者商品價格:80 元

該例子示範了一個 PHP 介面的簡單應用。該例子中,User 介面實現使用者的折扣,而在 VipUser 類裡面實現了具體的折扣係數。最後商品類 Goods 根據 User 介面來實現不同的使用者報價。

該例子僅限於示範 PHP 介面的用法,不涉及其科學與否。

實現多個介面

PHP也可以在繼承一個類的時候同時實現多個介面:

class 子類 extends 父類 implemtns 介面1, 介面2, ... {  ...... }


抽象類別和介面的區別

介面是特殊的抽象類別,也可以看做是一個模型的規範。介面與抽象類別大致區別如下:

1.一個子類如果 implements 一個介面,就必須實現介面中的所有方法(不管是否需要);如果是繼承一個抽象類別,只需要實現需要的方法即可。

2.如果一個介面中定義的方法名改變了,那麼所有實現此介面的子類需要同步更新方法名;而抽象類別中如果方法名改變了,其子類對應的方法名將不受影響,只是變成了一個新的方法而已(相對老的方法實現)。

3.抽象類別只能單繼承,當一個子類需要實現的功能需要繼承自多個父類時,就必須使用介面。


<?php//簡單定義實現介面interface UserInterface{ //定義user介面 function getname();}interface TeacherInterface{ //定義teacher介面 function getLengthofService();}class User implements UserInterface{ //實現user介面 private $name="nostop"; public function getName(){  return $this->name; }}class Teacher implements TeacherInterface{ //實現teacher介面 private $age=23; public function getLengthofService(){  return $this->age; }}$user=new User();echo $user->getName().'<br />';//nostop$teacher=new Teacher();echo $teacher->getLengthofService().'<br />';//23//繼承類實現介面class GraduResultudent extends User implements TeacherInterface{ //繼承User類 實現介面 private $teacher; public function construct(){  //定義建構函式  $this->teacher=new Teacher(); //執行個體化Teacher對象 } public function getLengthOfService(){ //實現TeacherInterface介面的方法  return $this->teacher->getLengthOfService(); }}class Result{ public static function getUserName(UserInterface $_user){ //注意:這裡面的類型變成介面類型  echo "Name is ".$_user->getName().'<br />'; } public static function getLengthOfService(TeacherInterface $_teacher){ //注意:這裡面的類型變成介面類型  echo "age is ".$_teacher->getLengthOfService(); }}$object=new GraduResultudent();Result::getUserName($object); //Name is nostopResult::getLengthOfService($object); //age is 23echo "<br />";//介面實現使用者的折扣interface People{ //定義介面 function getUserType(); function getCount();}class VipUser implements People{ //實現介面 //使用者折卡係數 private $discount=0.8; function getUserType(){  return "VIP使用者"; } function getCount(){  return $this->discount;   }}$vip=new VipUser(); //實現化對象echo $vip->getUserType().'商品價格:'.$vip->getCount()*100; //VIP使用者商品價格:80class Goods{ var $price=100; var $member; function run(People $member){ //注意:這裡面的參數類型是介面類型  $this->member=$member;  $discount=$this->member->getCount();  $usertype=$this->member->getUserType();  echo $usertype."商品價格:".$this->price*$discount; }}$display=new Goods();$display->run(new VipUser);//VIP使用者商品價格:80?>

總結

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.