Trait は PHP5.4 の新機能であり、PHP の多重継承に対するソリューションです。たとえば、2 つの抽象クラスを同時に継承するのは非常に面倒です。Trait はこの問題を解決するように設計されています。
使い方は簡単ですまず最初に、もちろん、PHP5.4 では trait キーワードが追加されました:
trait first_trait { function first_method() { /* Code Here */ } function second_method() { /* Code Here */ }}
同時に、クラスで Trait を使用したい場合は、use キーワードを使用します:
class first_class { // 注意这行,声明使用 first_trait use first_trait;}$obj = new first_class();// Executing the method from trait$obj->first_method(); // valid$obj->second_method(); // valid
同じクラスで複数の特性を使用できます:
trait first_trait{ function first_method() { echo "method1"; }}trait second_trait { function second_method() { echo "method2"; }}class first_class { // now using more than one trait use first_trait, second_trait;}$obj= new first_class();// Valid$obj->first_method(); // Print : method1// Valid$obj->second_method(); // Print : method2
同時に、特性を相互にネストすることもできます。例:
trait first_trait { function first_method() { echo "method1"; }}trait second_trait { use first_trait; function second_method() { echo "method2"; }}class first_class { // now using use second_trait;}$obj= new first_class();// Valid$obj->first_method(); // Print : method1// Valid$obj->second_method(); // Print : method2
トレイトで実装する必要がある抽象メソッドを宣言して、それを使用するクラスがそれを実装する必要があるようにすることができます:
trait first_trait { function first_method() { echo "method1"; } // 这里可以加入修饰符,说明调用类必须实现它 abstract public function second_method();}class first_method { use first_trait; function second_method() { /* Code Here */ }}
複数のトレイトを同時に使用すると必然的に競合が発生します。解決する。 PHP5.4 では、文法面から関連するキーワード構文を導入しています。 。注意すべき点がいくつかあります:
特性は、呼び出しクラスによって継承された親クラスのメソッドをオーバーライドします。特性は、クラスのように単一の特性をインスタンス化するために new を使用できません。単一のクラス内で複数の特性を使用できます。 . Trait は、final、static、abstract などの修飾子 (修飾子) をサポートしており、Traits 間の競合を解決するために、 replaceof および as 演算子を使用できます正直に言うと、最初に Trait を見たときは、良い印象はありませんでした。 PHP5 以降の新機能は十分にあり、開発者は少し圧倒されています。
同時に、Trait はプログラマにとっては「構文糖衣」に似ており、利便性を提供する一方で、大きな隠れた危険性を引き起こす可能性があります。 たとえば、Trait はクラス内のメンバーを呼び出すことができます:
trait first_trait { function first_function() { echo "From First Trait"; }}trait second_trait { // 这里的名称和 first_trait 一样,会有冲突 function first_function() { echo "From Second Trait"; }}class first_class { use first_trait, second_trait { // 在这里声明使用 first_trait 的 first_function 替换 // second_trait 中声明的 first_trait::first_function insteadof second_trait; }} $obj = new first_class();// Output: From First Trait$obj->first_function();
同時に、Trait はクラスに実装されているメソッドには影響しません:
trait Hello { public function sayHelloWorld() { echo 'Hello'.$this->getWorld(); } abstract public function getWorld();}class MyHelloWorld { private $world; use Hello; public function getWorld() { return $this->world; } public function setWorld($val) { $this->world = $val; }}
それでは、なぜ Trait が表示されるのでしょうか?友人の答えはもっと興味深いですが、不合理ではありません:
trait HelloWorld { public function sayHello() { echo 'Hello World!'; }}class TheWorldIsNotEnough { use HelloWorld; public function sayHello() { echo 'Hello Universe!'; }}$o = new TheWorldIsNotEnough();$o->sayHello(); // echos Hello Universe!
とはいえ、インターフェースと Trait の類似点を考慮すると、Trait の方がより便利であることは明らかです (ただし、この 2 つは互いに完全に置き換えることはできません)。
しかし、Trait がまだテスト段階にあることは明らかであり、その将来については PHP5 の他の新しく導入された機能よりも様子見の必要がありますが、おそらくこの機能は将来の PHP5 の継承方法を変える可能性があります。
参考リンク http://php.net/manual/en/ language.oop5.traits.php https://wiki.php.net/rfc/traits http://en.wikipedia.org/wiki/Trait_%28computer_programming %29 http://bbs.phpchina.com/thread-210870-1-1.html http://scg.unibe.ch/research/traits/ http://walu.sinaapp.com/?p=60 http ://www.phppan.com/2011/07/mixin-and-trait/
転載元: http://www.kuqin.com/web/20111119/315048.html