http://php.net/manual/en/ language.oop5.traits.php
PHP5.4.0 以降、PHP は train と呼ばれるコード再利用の方法を実装しました。
Traits は、PHP のような単一継承言語用に用意されたコード再利用メカニズムです。トレイトは、単一継承ステートメントの制約を軽減し、開発者が異なる階層内の独立したクラスでメソッド セットを自由に再利用できるように設計されています。特性とクラス構成のセマンティクスは、複雑さを軽減し、従来の継承とミックスインに関連する典型的な問題を回避する方法を定義します。
トレイトはクラスに似ていますが、きめ細かく統一された方法で機能を組み合わせるようにのみ設計されています。特性を単独でインスタンス化することはできません。これは、従来の継承に水平機能の組み合わせを追加します。つまり、アプリケーション クラスのメンバーを継承する必要がありません。
私の理解では、率直に言うと、サブクラスが継承クラスチェーン内の親クラスの特定の特性を継承することを意味します(つまり、サブクラスが「親クラスの特性を使用したい」場合、特性がが存在する場合は、特性メソッドが最初に呼び出されます (プロパティなど)。
<pre class="scode"><?php/** * Date: 2016/3/28 * Time: 16:38 */trait MyTrait{ protected $var = "MyTrait_var"; protected $var1 = "MyTrait_var"; function __construct() { echo $this->var.PHP_EOL; } function a() { echo "a".PHP_EOL; }}interface MyInterface{ function __construct(); function b();}abstract class MyAbstract{ protected $var2 = "MyAbstract_var"; use MyTrait; function b() { echo "b".PHP_EOL; }}class MyClass extends MyAbstract implements MyInterface{ protected $var3 = "MyClass_var"; //也可以在这里引用,不区分继承关系 //use MyTrait function c() { echo "c".PHP_EOL; }}$class = new MyClass();$class->a();$class->b();$class->c();
出力結果:
概要:
①本質的にはtraitとincludeファイルの概念は似ています
②traの方が便利に実装できるコードを再利用するため、継承関係により、親クラスではサブクラスのプライベート プロパティやメソッドにアクセスできず、トレイトはオブジェクトに直接コードを記述するのと同じ効果があることを理解する必要があります
③トレイトを使用するときは、特に名前の競合を断固として回避する必要があります。同時に使用する場合 複数の特性がある場合。
④ 名前の競合が発生した場合、2 つの可視性、初期値、静的値がまったく同じである場合、トレイト内の値がオブジェクト内の値を上書きし、E_STRICT エラーがスローされます。それ以外の場合は、E_COMPILE_ERROR エラーがスローされます。スローされてコンパイルが終了します。