zoukankan      html  css  js  c++  java
  • 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 payinterfacePayInterface;
    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 payinterfacePayInterface;
    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 paywayPayWay;
    use wechatWeChat;
    use alipayAliPay;
    use sayworldSayWorld;
    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 payPay;
    $pay = new Pay();
    $pay->wechat()->query('1234');
    $pay->alipay()->query('1234');
    $pay->test();
    

    输出结果:

  • 相关阅读:
    遇到的两个问题
    项目分析(map复习)
    while小问题
    二级指针
    映射文件实现进程通信
    struct {0}初始化
    用boost共享内存实现进程通信的例子
    mongo二维数组操作
    项目分析(channelid是如果产生的)
    string为什么可以写入共享内存
  • 原文地址:https://www.cnblogs.com/it-abel/p/9315664.html
Copyright © 2011-2022 走看看