zoukankan      html  css  js  c++  java
  • 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(); 
    步行....继续步行...
    男人吃饭
    女人说话
    小孩唱歌
    女人跳舞

     

  • 相关阅读:
    java多线程调试
    nginx学习网站收录
    eclispe使用
    网站收集
    《TCP/IP详解卷1:协议》——第6章 ICMP:Internet控制报文协议(转载)
    深入理解计算机系统——第12章:用信号量同步线程
    《TCP/IP详解卷1:协议》——第5章 RARP:逆地址解析协议(转载)
    YYHS-Floor it(递推+矩阵乘法+快速幂)
    YYHS-数列
    (转)Tarjan应用
  • 原文地址:https://www.cnblogs.com/wt645631686/p/8325884.html
Copyright © 2011-2022 走看看