php物件導向多繼承實現

OldBoy~發表於2018-01-21

在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(); 
步行....繼續步行...
男人吃飯
女人說話
小孩唱歌
女人跳舞

 

相關文章