ホームページ  >  記事  >  バックエンド開発  >  PHPにおけるトレイトとはどういう意味ですか? php の特性の簡単な紹介

PHPにおけるトレイトとはどういう意味ですか? php の特性の簡単な紹介

不言
不言オリジナル
2018-09-14 16:46:026753ブラウズ

この記事の内容は、php の trait とは何ですか? php での特性の簡単な紹介は、一定の参考価値があります。必要な友人が参照することができます。お役に立てば幸いです。

PHPにおけるトレイトとはどういう意味ですか? php の特性の簡単な紹介

#特性とは何ですか?

PHP公式サイトの紹介文をご覧ください。

PHP 5.4.0 以降、PHP は traits と呼ばれるコード再利用の方法を実装しています。

Trait は、PHP のような単一継承言語向けに用意されたコード再利用の仕組みです。トレイトは、単一継承言語の制限を軽減し、開発者が異なる階層内の独立したクラスでメソッドを自由に再利用できるように設計されています。特性とクラス構成のセマンティクスは、複雑さを軽減し、従来の多重継承や Mixin クラスに関連する典型的な問題を回避する方法を定義します。

Trait はクラスに似ていますが、きめ細かく一貫した方法で機能を組み合わせるようにのみ設計されています。トレイト自体を通じてインスタンス化することはできません。従来の継承に水平機能の組み合わせが追加されています。つまり、アプリケーション内の複数のクラス間の継承が必要ありません。

例1

携帯電話や自動車にはGPS機能が搭載されており、GPSは測位に利用されているため、機能を統一する必要があります。携帯電話と自動車はGPS機能以外は基本的に共通点がないため、継承は使えません。インターフェースに関しては、実装するクラスが異なるとインターフェースの実装も異なると思いますが、GPSの機能は測位です。したがって、クラスとインターフェイスの代わりに特性を使用します。これは私の理解であり、それが正しいかどうかはわかりません。

gps.php の定義:

<?php

trait Gps {
    public function gps() {
        echo &#39;i can gps&#39;;
    }
}

trait を使用して再利用する GPS 特性を定義します。そのキーワードは trait です。次に、それを car.php と mobile.php で参照します。

car.php の定義:

class Car {
    use gps;

    public function move() {
        echo &#39;i can move&#39;;
    }
}

mobile.php の定義:

<?php

class Mobile {
    use gps;
    public function tel() {
        echo &#39;i can tel&#39;;
    }
}

car.php と mobile.php で、use キーワードを使用して gps 特性を導入します。これにより、車やモバイルで gps() メソッドを呼び出すことができます。

test.php テスト:

<?php
require_once(&#39;gps.php&#39;);
require_once(&#39;car.php&#39;);
require_once(&#39;mobile.php&#39;);
$car = new Car();
$mobile = new Mobile();
$car->gps();
echo "\n";
$mobile->gps();

出力結果は次のとおりです:

1 i can gps
2 i can gps

例 2

車に別のものを導入国産GPSです。

gpschina.php は次のように定義されています:

<?php

trait GpsChina {

    public function gps() {
        echo &#39;i can chinae gps&#39;;
    }
}

car に導入されているため、car.php の定義を次のように変更します:

<?php
class Car {
    use gps, gpschina;    
    public function move() {
        echo &#39;i can move&#39;;
    }
}

テストのために test.php を再度呼び出します。

1 Fatal error: Trait method gps has not been applied, because there are collisions with other trait methods on Car in Car.php on line 4

導入されたトレイトでは、gps と gpschina にはそれぞれ gps があり、$car->gps() を直接使用する場合、どちらであるかを判断することは不可能です。 gps の gps() メソッドが使用されていますが、引き続き gpschina の gps() メソッドを使用しているため、エラーが報告されました。この場合、1 つを特定する必要があります。 car.php ファイルを変更します。

<?php

class Car {
    use gps, gpschina {
        GpsChina::gps insteadof Gps;
    }
    
    public function move() {
        echo &#39;i can move&#39;;
    }
}

このように、GpsChina::gps メソッドを使用して Gps メソッドを置き換え、test.php を呼び出して確認します。

1 i can chinae gps
2 i can gps

このように、gpschina の gps() メソッドは $car->gps() の後に呼び出されます。

例 3

Car クラス自体に gps() メソッドがある場合はどうなるでしょうか。 Car クラスを変更します。

<?php

class Car {
    use gps, gpschina {
        GpsChina::gps insteadof Gps;
    }
    
    public function gps() {
        echo &#39;car::gps&#39;;
    }
    

    public function move() {
        echo &#39;i can move&#39;;
    }
}

test.php を呼び出して結果を表示します。

1 car::gps
2 i can gps

Car クラス自体の gps() メソッドが呼び出されていることがわかります。

クラス内で、親クラスから継承したメソッド、トレイトを導入するためのuseメソッド、クラス自身のメソッドが同じ名前の場合、自クラスのメソッドが先に呼び出されます。独自のクラスのメソッドがない場合は、特性を導入する use メソッドが呼び出されます。最初の 2 つが使用できない場合は、親クラスから継承されたメソッドが呼び出されます。

関連する推奨事項:

php の trait の意味は何ですか?

特性とは何ですか? php

での Trait の宣言と使用スキルの共有

以上がPHPにおけるトレイトとはどういう意味ですか? php の特性の簡単な紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。