首頁  >  文章  >  後端開發  >  詳解php中的implements使用

詳解php中的implements使用

微波
微波原創
2017-06-28 12:00:201535瀏覽

php類別中介面的應用程式關鍵字是interface、implements了,介面是一種成員屬性全部為抽像或常數的特殊抽象類別,implements主要是對類名,類別所擁有的方法,以及所傳參數起約束和規範做用,有點像abstract 抽象類別

php類別中介面的應用程式關鍵字是interface、implements了,介面是一種成員屬性全部為抽像或常數的特殊抽象類別,implements主要是對類別名,類別所擁有的方法,以及所傳參數起約束和規範做用,有點像abstract 抽象類別。

類別中介面的應用程式

1.關鍵字:interface

2.關鍵字:implements

#1.介面的介紹與建立

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

規則:

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

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

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

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

格式程式碼如下:

interface demo { 
const NAME = "常量对象属性"; 
function myfun1(); //抽象方法
function myfun2(); //抽象方法,不用具体写入逻辑 
}

一,介面的定義與呼叫

<?php
interface Cinema
{
  const film = &#39;加勒比海盗&#39;;
  public function show();
}
class Order implements Cinema
{
  public function show()
  {
    echo "影院 接口开放了<br>";
  }
}
$face = new Order();
echo $face->show();    
echo Cinema::film;

說明:上面的範例要注意一點,介面的方法名是show,繼承介面的類別中必須有show這個方法,不然就會報錯。也就是說介面的方法是假的,真正起作用的是在繼承的類別中的方法,這裡介面和php的抽象類別是不是有點像了?

二,對參數約束比較嚴格

<?php
interface Cinema
{
  public function show(Order $show,$num);
}
// 显示正常
class Order implements Cinema
{
  public $number=&#39;0011排&#39;;
  public function show(Order $show,$num)
  {
    echo $show->number.$num;
  }
}
$face= new Order();
$face->show(new Order,$num=&#39;3人&#39;);//输出 0011排3人

說明:上面的這個範例繼承介面類別中,當呼叫介面的方法時,所傳參數要和介面中的參數名稱要一至。不然就會報錯。

三,介面間的繼承和呼叫介面傳遞參數

<?php
interface Cinema
{
  public function show();
}
interface Cinema1 extends Cinema
{
  public function show1(Order1 $object,$num);
}
class Order implements Cinema1
{
  public function show()
  {
    echo "准备就绪<br>";
  }
  public function show1(Order1 $object,$num)
  {
    //var_dump($object);
    echo $object->number."$num<br>";
  }
}
class Order1
{
  public $number="0012排";
  function fun(){
    echo &#39; =================&#39;;
  }
}
$show = new Order1;
$show->fun();     
$test = new Order();
$test->show();      
$test->show1($show,$num=&#39;6人&#39;);
// 输出 ===============准备就绪0012排6人

#說明:上面的範例可以看到,介面Cinemal1繼承了介面Cinemal,類別Order繼承了接口Cinemal1。我不知道你發現沒有,class類別Order其中包含二個方法,一個是show,一個show1,而且一個也不能少,如果少一個,報fatal錯誤。 show1(Order1 $object,$num)中的Order1必須根繼承類別的名子要一樣class Order1。如果不一樣,也會報fatal錯誤。那如果一個介面被多個類別繼承,而類別名稱又不一樣,怎麼辦呢?那就要用self了,下面會提到

 四,一個介面多個繼承

<?php
interface demo {
  const NAME = "电影名称";
  function fun1();
  function fun2();
}
interface demo2 {
  function fun3();
  function fun4();
}
interface demo3 {
  const TEST = "这里是测试Test";
  function fun5();
}
class MyDemo implements demo, demo2 {
  function fun1() {
    echo "你好";
  }
  function fun2() {
    echo "----------";
  }
  function fun3() {
    echo "我也好<br />";
  }
  function fun4() {
    echo "大家都好<br />";
  }
}
class YourDemo extends MyDemo implements demo3 {
  function fun5() {
    echo "继承类后引用接口";
  }
}
$p = new YourDemo;
$p->fun1();
$p->fun2();
$p->fun3();
$p->fun4();
$p->fun5();

以上輸出

你好--- -------我也好

大家都好

繼承類別後引用介面

上面的範例中我們可以看到介面都使用關鍵字interface來定義,並使用關鍵字implements 來實作介面中的方法,再舉個例子:

<?php
//定义接口
interface User{
  function getDiscount();
  function getUserType();
}

class VipUser implements User{ //VIP用户 接口实现
  private $discount = 0.8;  // VIP 用户折扣系数
  function getDiscount() {
    return $this->discount;
  }
  function getUserType() {
    return "VIP用户";
  }
}
class Goods{
  var $price = 88;
  var $vc;
  function run(User $vc){   //定义 User 接口类型参数,这时并不知道是什么用户
    $this->vc = $vc;
    $discount = $this->vc->getDiscount();
    $usertype = $this->vc->getUserType();
    echo $usertype."商品价格:".$this->price*$discount;
  }
}
$display = new Goods();
$display ->run(new VipUser); //VIP用户商品价格:70.4

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

最後總結下:

抽象類和介面的區別

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

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

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

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

以上是詳解php中的implements使用的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn