Heim  >  Artikel  >  Backend-Entwicklung  >  So verwenden Sie den Trait- oder Kombinationsmodus, um Mehrfachvererbung in PHP zu implementieren

So verwenden Sie den Trait- oder Kombinationsmodus, um Mehrfachvererbung in PHP zu implementieren

醉折花枝作酒筹
醉折花枝作酒筹nach vorne
2021-07-21 16:17:542291Durchsuche

Die Klassenvererbung von PHP kann nur eine Einzelvererbung und keine Mehrfachvererbung sein. Wenn Sie eine Mehrfachvererbung erreichen möchten, können Sie Schnittstellen verwenden, um eine Mehrfachvererbung zu erreichen Die Umsetzung kann natürlich auch über das Kombinationsmuster erfolgen.

So verwenden Sie den Trait- oder Kombinationsmodus, um Mehrfachvererbung in PHP zu implementieren

Trait ist eine neue Code-Wiederverwendungsmethode in PHP 5.4. Trait ist ein Code-Wiederverwendungsmechanismus, der für Sprachen mit einfacher Vererbung wie PHP vorbereitet ist. Merkmale sollen die Einschränkungen von Sprachen mit einfacher Vererbung verringern und Entwicklern die freie Wiederverwendung von Methoden in unabhängigen Klassen innerhalb verschiedener Hierarchien ermöglichen. Die Semantik der Zusammensetzung von Merkmalen und Klassen definiert eine Möglichkeit, die Komplexität zu reduzieren und die typischen Probleme zu vermeiden, die mit herkömmlicher Mehrfachvererbung und Mixin-Klassen verbunden sind.

Trait ähnelt Class, ist jedoch nur darauf ausgelegt, Funktionalität auf feinkörnige und konsistente Weise zu kombinieren. Kann nicht durch das Merkmal selbst instanziiert werden. Es fügt der traditionellen Vererbung eine Kombination horizontaler Funktionen hinzu; das heißt, es ist keine Vererbung zwischen mehreren Klassen in einer Anwendung erforderlich.

Verwenden Sie normalerweise das Schlüsselwort „use“ in einer Klasse, um den zu kombinierenden Merkmalsnamen zu deklarieren. Bei der Deklaration eines bestimmten Merkmals wird das Schlüsselwort „trait“ verwendet, und das Merkmal kann nicht direkt instanziiert werden.

Der Code lautet wie folgt:

<?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

Der Code verwendet zwei Merkmale, um Mehrfachvererbung zu implementieren.

Hinweis: Die gleiche Methode kann nicht in zwei Merkmalen vorkommen, wenn es eine Methode mit demselben Namen gibt, tritt ein schwerwiegender Fehler auf.

Hinweis: Es gibt auch eine aaa-Methode in der MyHelloWorld-Klasse, die die aaa-Methode im Hello-Merkmal überschreibt.

Der obige Code kann auch durch das kombinierte Muster implementiert werden. Der Code lautet wie folgt:

<?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

Wenn er durch Merkmale implementiert wird, ist die Codemenge natürlich viel geringer und die Lesbarkeit viel höher.

Empfohlenes Lernen: php-Video-Tutorial

Das obige ist der detaillierte Inhalt vonSo verwenden Sie den Trait- oder Kombinationsmodus, um Mehrfachvererbung in PHP zu implementieren. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:csdn.net. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen