PHP 5.4 の特性

WBOY
リリース: 2016-06-23 14:30:52
オリジナル
1039 人が閲覧しました

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 の継承方法を変える可能性があります。

なぜなら、私は個人的に、たとえそれが遠い PHP6 で起こるとしても、PHP のスコープチェーンの設計は遅かれ早かれ「より JavaScript に似たもの」に変わるだろうと固く信じているからです。

参考リンク 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


関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート