首頁  >  文章  >  後端開發  >  關於php中implements的使用實例分享

關於php中implements的使用實例分享

黄舟
黄舟原創
2017-06-18 13:42:321620瀏覽

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

類別中介面的應用程式

1.關鍵字:interface

2.關鍵字:implements

# 1.介面的介紹與建立

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

規則:

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

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

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

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

格式程式碼如下:


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

一,介面的定義與呼叫

<?phpinterface 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的抽象類別是不是有點像了?
二,對參數約束比較嚴

<?phpinterface 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人

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

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

<?phpinterface 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