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();
    

    输出结果:

  • 相关阅读:
    免费的视频、音频转文本
    Errors are values
    Codebase Refactoring (with help from Go)
    Golang中的坑二
    Cleaner, more elegant, and wrong(msdn blog)
    Cleaner, more elegant, and wrong(翻译)
    Cleaner, more elegant, and harder to recognize(翻译)
    vue控制父子组件渲染顺序
    computed 和 watch 组合使用,监听数据全局数据状态
    webstorm破解方法
  • 原文地址:https://www.cnblogs.com/it-abel/p/9315664.html
Copyright © 2011-2022 走看看