ホームページ  >  記事  >  バックエンド開発  >  特性モードまたは組み合わせモードを使用して PHP で多重継承を実装する方法

特性モードまたは組み合わせモードを使用して PHP で多重継承を実装する方法

醉折花枝作酒筹
醉折花枝作酒筹転載
2021-07-21 16:17:542295ブラウズ

PHP のクラス継承は単一継承のみであり、多重継承はできません。多重継承を実現したい場合は、インターフェース メソッドを使用して多重継承を実現できますが、インターフェース メソッドを使用したくない場合は、多重継承を実現できません。多重継承の場合は、Traits を使用することを検討できます。もちろん、合成パターンを使用して実装することもできます。

特性モードまたは組み合わせモードを使用して PHP で多重継承を実装する方法

Trait は、PHP 5.4 の新しいコード再利用メソッドです。 Trait は、PHP のような単一継承言語用に用意されたコード再利用メカニズムです。トレイトは、単一継承言語の制限を軽減し、開発者が異なる階層内の独立したクラスでメソッドを自由に再利用できるように設計されています。特性とクラス構成のセマンティクスは、複雑さを軽減し、従来の多重継承や Mixin クラスに関連する典型的な問題を回避する方法を定義します。

Trait はクラスに似ていますが、きめ細かく一貫した方法で機能を組み合わせるようにのみ設計されています。トレイト自体を通じてインスタンス化することはできません。従来の継承に水平機能の組み合わせが追加されています。つまり、アプリケーション内の複数のクラス間の継承が必要ありません。

通常、クラス内で use キーワードを使用して結合する特性名を宣言します。特定の特性の宣言には trait キーワードが使用され、特性を直接インスタンス化することはできません。

コードは次のとおりです:

<?php
/**
 * Traits可以多重继承,可以看做是一种加强型的接口
 */
trait Hello
{
    public function sayHello()
    {
        echo &#39;Hello &#39;;
    }
    public function aaa()
    {
        echo &#39;AAA&#39;;
    }
}
trait World
{
    public function sayWorld()
    {
        echo &#39;World&#39;;
    }
}
class MyHelloWorld
{
    use Hello, World;
    public function sayExclamationMark()
    {
        echo &#39;!&#39;;
    }
    // 会覆盖掉Hello中的aaa方法
    public function aaa()
    {
        echo &#39;AAAAA&#39;;
    }
}
$obj = new MyHelloWorld();
$obj->sayHello();
$obj->sayWorld();
$obj->sayExclamationMark();
$obj->aaa();
// 输出:
// Hello World!AAAAA

コードは 2 つの特性を使用して多重継承を実装します。

注意: 2 つのトレイトに同じメソッドを使用することはできません。同じ名前のメソッドが存在すると、致命的なエラーが発生します。

注: MyHelloWorld クラスには aaa メソッドもあります。これは、Hello トレイトの aaa メソッドをオーバーライドします。

上記のコードは、結合モードを通じて実装することもできます。コードは次のとおりです:

<?php
/**
 * 使用组合的方式也可以达到 1_12_trait.php 的效果
 */

class Hello2
{
    public function sayHello()
    {
        echo &#39;Hello &#39;;
    }

    public function aaa()
    {
        echo &#39;AAA&#39;;
    }
}

class World2
{
    public function sayWorld()
    {
        echo &#39;World&#39;;
    }

    public function aaa()
    {
        echo &#39;AAAA&#39;;
    }
}

class MyHelloWorld2
{
    public $obj = [];

    public function __construct()
    {
        $this->obj[&#39;Hello2&#39;] = new Hello2();
        $this->obj[&#39;World2&#39;] = new World2();
    }

    public function sayExclamationMark()
    {
        echo &#39;!&#39;;
    }

    public function __call($name, $arguments)
    {
        foreach ($this->obj as $value) {
            if (method_exists($value, $name)) {
               return $value->$name();
                // 也可以用 return call_user_func([$value, $name]);
            }
        }

        if (!method_exists($this->obj[&#39;Hello2&#39;], $name) && !method_exists($this->obj[&#39;World2&#39;], $name)) {
            echo "\r\n不存在此方法";
        }

        return true;
    }

    // 会覆盖其他类的aaa方法
    public function aaa()
    {
        echo &#39;AAAAA&#39;;
    }
}

$obj = new MyHelloWorld2();
$obj->sayHello();
$obj->sayWorld();
$obj->saywhat();
$obj->aaa();
$obj->sayExclamationMark();

// 输出:
// Hello World!AAAAA

明らかに、特性を通じて実装すると、コードの量が大幅に減り、読みやすさが向上します。はるかに高くなります。

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

以上が特性モードまたは組み合わせモードを使用して PHP で多重継承を実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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