出典ます。https://blog.csdn.net/qq_35255775/article/details/80610586
PHPは、この問題を解決するために、今となっているために、前から2つの基本クラスのプロパティとメソッドから単一継承言語を継承することはできません、この機能形質をPHP7(私はこの形質を聞いて、言語がやや似て、いない特定されますゴー)は、言語を学びました。
使用するには:クラスのキーワードを使用して、文の特色名を組み合わせることができます。声明トレイト特定の形質のキーワードは、トレイトをインスタンス化することはできません。
コードは次のように:
<?PHP
形質猫{
公共の色= $ 'ブラック';
公共の仕事関数(){
エコー'とマウス'、 '<BR>';
}
}
クラスの動物{
公共RUN機能(){
エコー" '; ''速い<BR>実行
}
}
動物{拡張するクラスTmoCat
;使用猫
公衆色関数は(){
<BR>「>カラー、の$ this -エコー';
トム新しい新しいTmoCat = $();
$ tom->カラー();
$ tom-> RUN();
$ tom->ワーク();
結果は次の通りである:
試験形質、ベースクラス、同じ名前の加工特性および方法のこのクラスを
コードは以下の通りである:
形質猫{
公共の色= $「ブラック」;
公共の仕事関数(){
エコー「とマウス」、「<BR>」;
}
公共Run関数(){
エコー「猫は速く走ります」、「< BR> ';
}
}
クラスの動物{
公共の色= $'色';
公共の仕事関数(){
エコー'職務'' <BR> ';
}
公共Run関数(){
エコーは'速い走ります'' <BR>「;
}
}
クラスTmoCatは動物{延び
使用猫。
色=「ホワイト・ブラックの公開$;
公共の仕事関数(){
、>色の$ this -エコー'<BR>';
}
}
$ =新しい新トムTmoCat();
$ tom-> RUN();
$ tom- >ワーク();
このクラスは、ベースクラスを定義し、又は同じ形質は、以下に示す情報は、このクラスの基本クラス与えられ、属性が付与され、形質と同じ特性と定義することができない場合。
コードを変更します
。<?PHP
形質猫{
公共の色= $「ブラック」;
公共の仕事関数(){
エコー「とマウス」、「<BR>」;
}
公共RUN機能(){
エコー「猫は速く走ります」 '<BR>';
}
}
クラス動物{
パブリック関数ワーク(){
エコー'職務'、 '<BR>'。
}
クラスTmoCat拡張動物{
使用猫、
公共仕事関数(){
エコー'キャッチ・ジャック'、 '<BR>';
}
}
$ =新しい新トムTmoCat();
$ tom-> RUN();
$ tom->仕事();
結果は以下の通りである:
基底クラスが可視形質をカバーすることができ、本クラスのメソッドの形質を覆うことができます。
複数のクラスは、形質組み合わせることができる
クラスの形質複数のコンマの複数の形質によって分離され、組み合わされてもよいです。;使用例trait1、trait2ための
コードを示します
。<?PHP
形質猫{
パブリックカラー= $ 'ブラック';
公共の仕事関数(){
エコー'およびマウス'、 '<BR>';
}
}
形質タイガー{
パブリック関数EAT( ){
エコー「トラ肉」、「<BR>」。
RUN機能パブリック(){
エコーは、 '<BR>' '速く走る';
}
}
クラスTmoCat動物{拡張し
、使用の猫、タイガー
公衆カラー機能(){
の$ this - >カラー、 '<BR>'をエコー;
}
}
; =新しい新トムTmoCat()$
$ tom->色();
$ tom-> RUN();
$ tom->作品();
$ tom->は(EAT);
結果は次の通りである:
2 triat場合同じプロパティとメソッドを持って、それから区別するために、どのように、同じ時間の使用でありますか?
異なる特性またはプロパティが同じように存在しているとき、それは競合します、または溶液がinsteadof解決するとして使用されています。それはエイリアシングのためにあるようinsteadofは、代替手段です。
次のようにコードがある:
<?PHP
形質trait1 {
パブリック関数ドライブ(){
エコー'これはtrait1ドライブです'、 '<BR>';
パブリック関数の色(){
エコー「<BR>」「これはtrait1色です」。
}
}
形質trait2 {
パブリック関数ドライブ(){
エコー「<BR>」「これはtrait2ドライブです」。
}
パブリック関数色(){
エコー「<BR>」「これはtrait2色です」。
}
}
クラス車{
使用trait1、trait2 {
trait2 insteadof trait1 ::ドライブ。
trait1 :: trait2 insteadof色。
}
}
クラスバス{
使用trait1、trait2 {
trait2 insteadof trait1 ::ドライブ。
trait1 :: trait2 insteadof色。
trait2 ::カラー2色として、
trait2 ::
}
}
クラス自転車{
使用trait1、trait2 {
trait2 insteadof trait1 ::色。
trait2 ::カラー1色として;
trait2 :: trait1 insteadofドライブ。
ドライブ2としてtrait1 ::ドライブ。
}
}
$カー=新しい車();
$カルボ>色();
$カルボ>ドライブ();
'-------------'、 '<BR>'エコー;
$バス=新しいバス();
$ BUS->ドライブ();
$ BUS->色();
$ BUS->カラー2();
$ BUS->ドライブ2();
'-------------'、 '<BR>'エコー;
$自転車=新しい自転車();
$ bike->色();
$ bike->カラー1();
$ bike->ドライブ();
$ bike->ドライブ2();
结果如下:
注:他のプロパティまたはメソッドは、別名を与えられる定義する置換されていない場合二つの同一のプロパティまたはメソッドは、insteadof使用する属性および方法の別のものと交換しなければなりません。
この方法はまた、アクセス制御のように変形することができる
。<?PHP
形質動物{
機能をパブリックEAT(){
;エコー「動物が食べることができる」
}
}
クラスキャット{
{動物の使用
;動物を::保護としてEAT
}
}
{クラス犬
{動物を使用します
プライベートeat2 ::動物としてEAT;
}
}
;()新しい新しいCAT猫= $
$ cat->()をEAT; //出力することはできません、食べることを適切に保護するように変更されたため、
$ =新しい新しい犬犬();
$ DOGを> ()を食べる; //型が通常の出力が変更されていない食べる
$ dog-> eat2(); //型がeat2プライベートで正常に出力することができない
、また抽象メソッド、スタティックメソッド、静的プロパティ使用して、互いに組み合わせることができる形質
コード次のように:
<?PHPの
特性アニマル{
BR> '; }
a_name関数パブリック()
{
// TODO:()メソッドをa_nameを実装します。
エコー'アニマル抽象メソッド'、 '<BR>';
}
パブリック関数のショー(){
'アニマル静的プロパティ:'エコー、自己:: $のa_staを'<BR>';
'アニマル非静的プロパティ:'エコー、ます$ this-> a_not_sta、 '<BR>';
'タイガー静的プロパティ:'エコー、自己:: $のt_sta、 '<BR>';
「タイガーエコー非静的プロパティ: 'の$ this - > t_not_sta、' <BR>「;
}
}
$ =新しい新しいCAT猫();
$ cat->名();
$ cat-> a_name();
猫:: a_eat() ;
猫:: t_eat();
$ cat->ショー();
結果は次の通りであります