PHP namespace、abstract、interface、trait使用介紹


小菜鳥一枚,一直搞不懂 namespace、abstract、interface、trait 這些關系,就抽出幾天時間研究,做個總結,不足之處希望大家指正交流。

namespace 命名空間

介紹:顧名思義,就是給空間命名。其實最簡單的可以把每個文件夾都理解為一個空間,然后我們給這個空間一個定義(namespace),讓其成為正式空間。當然並不是說一個文件夾就需要一個空間(最好是),在同一個文件夾、文件也可以定義不同的空間。

作用:假如有兩個班(兩個文件夾),都有一個叫做 test(文件) 的學生,當兩個人需要同時出現時,我們應該怎么呼喚他們不至於搞混?很顯然,我們可以帶上前綴,比如,個子高的test,長得帥的test,或者一班test,這個前綴就相當於一個聲明。而命名空間,也即是聲明一個空間,這個空間可以叫做 class1也可以叫做height1。因此,命名空間的最大作用就是解決PHP內部的類/函數/常量或第三方類/函數/常量之間的名字沖突,也能很好地提高源碼的閱讀性。如下文,在一個文件里,使用了 namespace 我們就不會調用錯方法或類。

abstract、interface、trait的使用請看以下案例(本人現在也不熟、會持續更新的):

<?php
/* ============接口類=============*/
namespace payinterface;
interface PayInterface
{
    // 必須為公有
    public function query($transaction_number); // 根據流水號查詢支付信息
    public function check($card_info); // 驗證支付信息
    public function pay($card_info); // 支付
    public function refund($transaction_number); // 根據流水號退款
}
/* =================namespace itemplate end==================== */

/* ============抽象類=============*/
namespace payway;
abstract class PayWay
{
    abstract protected function wechat(); // 微信支付
    abstract public function alipay(); // 阿里支付
    // 繼承類的方法聲明必須和父類一樣(或者更為寬松),且父類方法不能為 private

    // 普通方法(非抽象方法),不能定義其具體的功能實現
    public function test()
    {
        echo '<br>===================<br>';
        echo '這是抽象類普通方法,子類可以使用'; 
        echo '<br>===================<br>';
    }
}
/* ================namespace abstractclass end===================== */

/*
* 微信支付方法具體實現
*/
namespace wechat;
use payinterface\PayInterface;
class WeChat implements PayInterface
{
    public function query($transaction_number)
    {
        echo '<br>===================<br>';
        echo 'This is WeChat query ' . $transaction_number; 
        echo '<br>===================<br>';
    }

    public function check($card_info)
    {
        echo '<br>===================<br>';
        echo 'This is WeChat check ' . $card_info; 
        echo '<br>===================<br>';
    }

    public function pay($card_info)
    {
        echo '<br>===================<br>';
        echo 'This is WeChat pay ' . $card_info; 
        echo '<br>===================<br>';
    }

    public function refund($transaction_number)
    {
        echo '<br>===================<br>';
        echo 'This is WeChat refund ' . $transaction_number; 
        echo '<br>===================<br>';
    }
}
/* =================namespace wechat end==================== */

/*
* 阿里支付方法具體實現
*/
namespace alipay;
use payinterface\PayInterface;
class AliPay implements PayInterface
{
    public function query($transaction_number)
    {
        echo '<br>===================<br>';
        echo 'This is AliPay query ' . $transaction_number; 
        echo '<br>===================<br>';
    }

    public function check($card_info)
    {
        echo '<br>===================<br>';
        echo 'This is AliPay check ' . $card_info; 
        echo '<br>===================<br>';
    }

    public function pay($card_info)
    {
        echo '<br>===================<br>';
        echo 'This is AliPay pay ' . $card_info; 
        echo '<br>===================<br>';
    }

    public function refund($transaction_number)
    {
        echo '<br>===================<br>';
        echo 'This is AliPay refund ' . $transaction_number; 
        echo '<br>===================<br>';
    }
}
/* =================namespace alipay end==================== */

/* ============Trait=============*/

namespace sayworld;
trait SayWorld {
    static function sayHello($str)
    {
        echo '<br>===================<br>';
        echo 'World! This is ' . $str;
        echo '<br>===================<br>';
    }
}
/* ================namespace sayworld end===================== */

namespace pay;
use payway\PayWay;
use wechat\WeChat;
use alipay\AliPay;
use sayworld\SayWorld;
Class Pay extends PayWay
{
    use SayWorld; // 不用實例化
    public function wechat()
    {
        SayWorld::sayHello('wechat');
        return new WeChat;
    }
    public function alipay()
    {
        SayWorld::sayHello('alipay');
        return new alipay;
    }
}
/* ================namespace pay end===================== */

/* ============實例化=============*/
use pay\Pay;
$pay = new Pay();
$pay->wechat()->query('1234');
$pay->alipay()->query('1234');
$pay->test();

輸出結果:


免責聲明!

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



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