zoukankan      html  css  js  c++  java
  • php trait 多继承问题

    php trait 多继承问题

    简介

    php从以前到现在一直都是单继承的语言,无法同时从两个基类中继承属性和方法,为了解决这个问题,

    php 从5.4出了Trait这个特性

    注意事项

    • Trait类不能实例化
    • Trait类里面的方法只能使用public权限

    例:

    <?php
    
    trait A{
        public function aa(){
            return 'aaa';
        }
    }
    
    trait B {
        public function bb(){
            return 'bb';
        }
    }
    
    class User{
        public function hello(){
            return 'hello';
        }
    }
    
    class VipUser extends User{
        use A;
        use B;
        public function  hello2(){
            return 'hello2';
        }
    
        //重写
        public function aa(){
            return 'AAAAA';
        }
    }
    
    $vip = new VipUser();
    echo $vip->aa();
    echo $vip->bb();
    

    运行结果

    image-20200526212614173

    多个trait里面方法重名冲突问题

    当不同的trait中,却有着同名的方法或属性,会产生冲突,可以使用insteadof或 as进行解决,insteadof 是进行替代,而as是给它取别名

    例:

    <?php
    
    class User {
        public function hello() {
            return 'hello';
        }
    }
    
    trait B {
        public function bb() {
            return 'bb';
        }
    }
    trait A {
        public function aa() {
            return 'aaa';
        }
        public function bb() {
            return 'BBBBB';
        }
    }
    
    class VipUser extends User {
        use A,B{
            // 如果调用的方法名为bb则,我们B中的方法指向到A中,
            // 而自己本身的bb方法则修改为bbb然后指向到自己的内容
            A::bb insteadof B;
            B::bb as bbb;
        }
        public function hello2() {
            return 'hello2';
        }
    }
    
    $vip  = new VipUser();
    
    echo $vip->bb();
    echo $vip->aa();
    

    运行结果

    image-20200526220225038

  • 相关阅读:
    Linux安装MySql
    Tomcat9配置SSL证书
    Linux安装Tomcat
    VMware安装Centos8
    Linux安装JDK
    mysql中utf8和utf8mb4区别
    MVVM模式
    深入浅析Node.js单线程模型
    同步异步阻塞非阻塞
    v-model
  • 原文地址:https://www.cnblogs.com/makalochen/p/12969265.html
Copyright © 2011-2022 走看看