• php面向对象多继承实现


    在PHP面向对象概念编程中,一个子类只能继承一个父类,但是从php5.4后新增traits实现代码复用机制变向达到多继承。Trait 为了减少单继承语言的限制,使开发人员能够自由地在不同层次结构内独立的类中复用方法集。

    1、trait和类相似,但不能被实例化,无需继承,只需要在类中使用关键词use引入即可,可引入多个traits,用','隔开
    2、trait会覆盖继承的方法,当前类会覆盖trait方法

    <?php  
    class People{  
        public function walk(){  
            echo "步行....";  
        }  
        function say(){  
            echo "说话<br/>";  
        }  
    }  
    trait Woman{
        public function eat(){  
            echo "女人吃饭<br/>";  
        }  
    
    
        public function dance(){  
            echo "女人跳舞<br/>";  
        }  
    }
    trait Man{  
        public function walk(){  
            parent::walk();
            echo "继续步行...<br/>";  
        }  
    
        public function say(){  
            echo "男人说话<br/>";  
        }  
        public function sing(){  
            echo "男人唱歌<br/>";  
        }  
    }  
      
    class Child extends People{  
        use Man,Woman;  
          
        public function sing(){  
            echo "小孩唱歌<br/>";  
        }  
        public function dance(){  
            echo "小孩跳舞<br/>";  
        }  
    
    }  
      
    $obj=new Child();  
    $obj->walk();  
    $obj->eat();  
    $obj->say();  
    $obj->sing();  
    $obj->dance(); 
    步行....继续步行...
    女人吃饭
    男人说话
    小孩唱歌
    小孩跳舞

    补充:

    如果两个 trait 都插入了一个同名的方法,如果没有明确解决冲突将会产生一个致命错误。
    为了解决多个 trait 在同一个类中的命名冲突,需要使用 insteadof 操作符来明确指定使用冲突方法中的哪一个。
    以上方式仅允许排除掉其它方法,as 操作符可以将其中一个冲突的方法以另一个名称来引入。

    <?php  
    class People{  
        public function walk(){  
            echo "步行....";  
        }  
        function say(){  
            echo "说话<br/>";  
        }  
    }  
    trait Woman{
        public function eat(){  
            echo "女人吃饭<br/>";  
        }  
        public function say(){  
            echo "女人说话<br/>";  
        }  
    
        public function dance(){  
            echo "女人跳舞<br/>";  
        }  
    }
    trait Man{  
        public function walk(){  
            parent::walk();
            echo "继续步行...<br/>";  
        }  
        public function eat(){  
            echo "男人吃饭<br/>";  
        }  
        public function say(){  
            echo "男人说话<br/>";  
        }  
        public function sing(){  
            echo "男人唱歌<br/>";  
        }  
    }  
      
    class Child extends People{  
        use Man,Woman {
            Man::eat insteadof Woman;
            Woman::say insteadof Man;
        } 
          
        public function sing(){  
            echo "小孩唱歌<br/>";  
        }  
        public function dance(){  
            echo "女人跳舞<br/>";  
        }  
    
    }  
      
    $obj=new Child();  
    $obj->walk();  
    $obj->eat();  
    $obj->say();  
    $obj->sing();  
    $obj->dance(); 
    步行....继续步行...
    男人吃饭
    女人说话
    小孩唱歌
    女人跳舞

     

  • 相关阅读:
    取物料特性
    MATCHCODE OBJECT 属性是什么意思
    SAPABAP用户权限检查
    FOR ALL ENTRIES的原理:
    上传EXCEL和text到SAP内表 ,SAP内表导出EXCEL
    屏幕设计设置默认值
    使用JOIN关联多张数据库表
    WHERE spras = sylangu.这是什么意思
    DESCRIBE TABLE
    取批次特性值
  • 原文地址:https://www.cnblogs.com/wt645631686/p/8325884.html
Copyright © 2020-2023  润新知