ホームページ  >  記事  >  バックエンド開発  >  PHP でトレイト機能を使用する方法

PHP でトレイト機能を使用する方法

醉折花枝作酒筹
醉折花枝作酒筹転載
2021-06-08 17:30:162225ブラウズ

この記事では、PHP でトレイト機能を使用する方法を紹介します。一定の参考値があるので、困っている友達が参考になれば幸いです。

PHP でトレイト機能を使用する方法

誰もがトレイトについてよく知っていると思いますが、5.4 の時点で、トレイトはすでに PHP の新機能に登場しています。もちろん、特性自体も機能を意味しますが、この機能の主な機能はコードの再利用です。

PHP が最新のオブジェクト指向言語であることは誰もが知っています。 C での多重継承の混乱を招く問題を解決するために、ほとんどの言語は単一継承と複数のインターフェイスの形式になっていますが、これにより、いくつかの再利用可能なコードを組み合わせて実装する必要があります。クラスをインスタンス化したり、静的メソッドを使用したりすると、メモリ使用量が増加するのは避けられません。この問題を解決するために、PHP はトレイト機能を正式に開始しました。コンボ能力のバリエーションと考えることができます。

trait A
{
    public $a = 'A';
    public function testA()
    {
        echo 'This is ' . $this->a;
    }
}

class classA
{
    use A;
}
class classB
{
    use A;
    public function __construct()
    {
        $this->a = 'B';
    }
}

$a = new classA();
$b = new classB();

$a->testA();
$b->testA();

上記のコードから、特性はどのクラスにも適用でき、変数も定義でき、非常に便利であることがわかります。トレイトに関して注意すべき最も重要な点は、同じ名前のメソッドのオーバーロードの優先順位です。

trait B {
    function test(){
        echo 'This is trait B!';
    }
}
trait C {
    function test(){
        echo 'This is trait C!';
    }
}

class testB{
    use B, C;
    function test(){
        echo 'This is class testB!';
    }
}

$b = new testB();
$b->test(); // This is class testB!
// class testC{
//     use B, C;
// }

// $c = new testC();
// $c->test(); // Fatal error: Trait method test has not been applied, because there are collisions with other trait methods on testC

ここでは、クラスで test() メソッドがオーバーロードされており、ここでの出力はクラスのメソッドです。 testB クラスの test() メソッドをコメントアウトすると、エラーが報告されます。プログラムは、どのトレイトの test() メソッドを使用するかを区別できないためです。代わりに を使用して、使用するメソッドが呼び出されるトレイトを指定できます。

class testE{
    use B, C {
        B::test insteadOf C;
        C::test as testC;
    }
}
$e = new testE();
$e->test(); // This is trait B!
$e->testC(); // This is trait C!

もちろん、実際の開発では、このような重複を避けるためにメソッド名の統一を図る必要があります。さらに、サブクラスがトレイトを参照し、親クラスが同じメソッドを定義している場合はどうなるでしょうか?もちろん、親クラスから継承したメソッドは引き続き呼び出されます。トレイトの優先順位は通常のクラス継承よりも低くなります。

trait D{
    function test(){
        echo 'This is trait D!';
    }
}

class parentD{
    function test(){
        echo 'This is class parentD';
    }
}

class testD extends parentD{
    use D;
}

$d = new testD();
$d->test(); // This is trait D!

最後に、抽象メソッドもトレイトで定義できます。この抽象メソッドは、このトレイトを参照するクラスで実装する必要があるメソッドであり、抽象クラス内の抽象メソッドと同じ効果があります。

trait F{
    function test(){
        echo 'This is trait F!';
    }
    abstract function show();
}

class testF{
    use F;
    function show(){
        echo 'This is class testF!';
    }
}
$f = new testF();
$f->test();
$f->show();

PHP の特徴は、実際のところ、非常に柔軟な関数であるということです。もちろん、柔軟性が高ければ高いほど、予期せぬエラーを避けるために、その使用ルールをいくつか理解する必要があります。

テスト コード:

https://github.com/zhangyue0503/dev-blog/blob/master/php/201912/source/trait%E8%83%BD%E5%8A%9B%E5%9C%A8PHP%E4%B8%AD%E7%9A%84%E4%BD%BF%E7%94%A8.php

推奨学習: php ビデオ チュートリアル

以上がPHP でトレイト機能を使用する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はsegmentfault.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。