美文网首页
PHP实现多继承

PHP实现多继承

作者: Yumazhiyao | 来源:发表于2019-02-20 16:09 被阅读0次

    方法一

    自 PHP 5.4.0 起,PHP 实现了一种代码复用的方法,称为 trait。

    Trait 是为类似 PHP 的单继承语言而准备的一种代码复用机制。Trait 为了减少单继承语言的限制,使开发人员能够自由地在不同层次结构内独立的类中复用 method。Trait 和 Class 组合的语义定义了一种减少复杂性的方式,避免传统多继承和 Mixin 类相关典型问题。

    Trait 和 Class 相似,但仅仅旨在用细粒度和一致的方式来组合功能。 无法通过 trait 自身来实例化。它为传统继承增加了水平特性的组合;也就是说,应用的几个 Class 之间不需要继承。

    从基类继承的成员会被 trait 插入的成员所覆盖。优先顺序是来自当前类的成员覆盖了 trait 的方法,而 trait 则覆盖了被继承的方法。

    trait traitTestOne{
        public function test(){
            echo "This is trait one <br/>";
        }
        public function testOne(){
            echo "one <br/>";
        }
    }
     
    trait traitTestTwo{
    //  public function test(){
    //      echo "This is trait two";
    //  }
        public function testTwo(){
            echo "two <br/>";
        }
    }
     
    class basicTest{
        public function test(){
            echo "hello world\n";
        }
    }
    class myCode extends basicTest{
        use traitTestOne,traitTestTwo;
    }
     
    $test = new mycode();
    $test->test();
    $test->testOne();
    $test->testTwo();
    

    输出:

    This is trait one
    one
    two
    

    方法二

    class Parent1 {
        function method1() {}
        function method2() {}
    }
    class Parent2 {
        function method3() {}
        function method4() {}
    }
    class Child {
        protected $_parents = array();
        public function Child(array $parents=array()) {
            $this->_parents = $parents;
        }
         
        public function __call($method, $args) {
            // 从“父类"中查找方法
            foreach ($this->_parents as $p) {
                if (is_callable(array($p, $method))) {
                    return call_user_func_array(array($p, $method), $args);
                }
            }
            // 恢复默认的行为,会引发一个方法不存在的致命错误
            return call_user_func_array(array($this, $method), $args);
        }
    }
    $obj = new Child(array(new Parent1(), new Parent2()));
    print_r( array($obj) );die;
    $obj->method1();
    $obj->method3();
    

    方法三

    interface testA{   
        function echostr();   
    }    
    interface testB extends testA{   
        function dancing($name);   
    }    
    class testC implements testB{   
      
        function echostr(){   
            echo "接口继承,要实现所有相关抽象方法!";   
            echo "<br>";   
        }    
      
        function dancing($name){   
            echo $name."正在跳舞!";    
        }    
    }    
    $demo=new testC();   
    $demo->echostr();   
    $demo->dancing("模特");
    

    相关文章

      网友评论

          本文标题:PHP实现多继承

          本文链接:https://www.haomeiwen.com/subject/nemhyqtx.html