| ユーザフォーラムで議論/質問 | マニュアル検索 | ハイライト | ハイライトオフ | ポータル | php spot |
トレイトPHP 5.4.0 以降では、コードを再利用するための「トレイト」という仕組みが導入されました。 トレイトは、PHP のような単一継承言語でコードを再利用するための仕組みのひとつです。 トレイトは、単一継承の制約を減らすために作られたもので、 いくつかのメソッド群を異なるクラス階層にある独立したクラスで再利用できるようにします。 トレイトとクラスを組み合わせた構文は複雑さを軽減させてくれ、 多重継承や Mixin に関連するありがちな問題を回避することもできます。 トレイトはクラスと似ていますが、トレイトは単にいくつかの機能をまとめるためだけのものです。 トレイト自身のインスタンスを作成することはできません。 昔ながらの継承に機能を加えて、振る舞いを水平方向で構成できるようになります。 つまり、継承しなくてもクラスのメンバーに追加できるようになります。 例1 トレイトの例
<?php 優先順位基底クラスから継承したメンバーよりも、トレイトで追加したメンバーのほうが優先されます。 優先順位は現在のクラスのメンバーが最高で、その次がトレイトのメソッド、 そしてその次にくるのが継承したメソッドとなります。 例2 優先順位の例 基底クラスから継承したメソッドは、MyHelloWorld に SayWorld トレイトから追加されたメソッドで上書きされます。 この挙動は、MyHelloWorld クラスで定義したメソッドでも同じです。 優先順位は現在のクラスのメンバーが最高で、その次がトレイトのメソッド、 そしてその次にくるのが継承したメソッドとなります。
<?php 上の例の出力は以下となります。 Hello World! 例3 もうひとつの優先順位の例
<?php 上の例の出力は以下となります。 Hello Universe! 複数のトレイト複数のトレイトをひとつのクラスに追加するには、use 文でカンマ区切りで指定します。 例4 複数のトレイトの使用例
<?php 上の例の出力は以下となります。 Hello World! 衝突の解決同じ名前のメンバーを含む複数のトレイトを追加するときには、 衝突を明示的に解決しておかないと fatal エラーが発生します。 同一クラス内での複数のトレイト間の名前の衝突を解決するには、 insteadof 演算子を使って そのうちのひとつを選ばなければなりません。 この方法はひとつのメソッドだけしか使えませんが、 as 演算子を使うと、 メソッドのいずれかにエイリアスを追加できます。 as 演算子はメソッドをリネームするわけではないので、 その他のメソッドにも何も影響を及ぼさないことに注意しましょう。 例5 衝突の解決 この例では、Talker がトレイト A と B を使います。 A と B には同じ名前のメソッドがあるので、 smallTalk はトレイト B を使って bigTalk はトレイト A を使うように定義します。 Aliased_Talker は、as 演算子を使って B の bigTalk の実装に talk というエイリアスを指定して使います。
<?php
メソッドの可視性の変更as 構文を使うと、 クラス内でのメソッドの可視性も変更することができます。 例6 メソッドの可視性の変更
<?php トレイトを組み合わせたトレイトクラスからトレイトを使えるのと同様に、トレイトからもトレイトを使えます。 トレイトの定義の中でトレイトを使うと、 定義したトレイトのメンバーの全体あるいは一部を組み合わせることができます。 例7 トレイトを組み合わせたトレイト
<?php 上の例の出力は以下となります。 Hello World! トレイトのメンバーの抽象化トレイトでは、抽象メソッドを使ってクラスの要件を指定できます。 例8 抽象メソッドによる、要件の明示
<?php トレイトの静的なメンバートレイトでは、静的なメンバーやメソッドを定義できます。 例9 静的な変数
<?php 例10 静的なメソッド
<?php プロパティトレイトにはプロパティも定義できます。 例11 プロパティの定義
<?php トレイトでプロパティを定義したときは、クラスでは同じ名前のプロパティを定義できません。 unless it is compatible (same visibility and initial value), otherwise a fatal error is issued. Before PHP 7.0.0, defining a property in the class with the same visibility and initial value as in the trait, raised an E_STRICT notice. 例12 衝突の解決
<?php |
![]() |
各種マニュアル:
PHPマニュアル |
PEARマニュアル |
Smarty(英語)マニュアル |
PHP-GTKマニュアル |
「トレイト」をGoogle検索
|