Maison > développement back-end > Problème PHP > Comment utiliser le mode trait ou combinaison pour implémenter l'héritage multiple en PHP

Comment utiliser le mode trait ou combinaison pour implémenter l'héritage multiple en PHP

醉折花枝作酒筹
Libérer: 2023-03-11 18:00:01
avant
2316 Les gens l'ont consulté

L'héritage de classe PHP ne peut être qu'un héritage unique, pas un héritage multiple. Si vous souhaitez obtenir un héritage multiple, vous pouvez utiliser la méthode d'interface pour obtenir un héritage multiple. Cependant, si vous ne souhaitez pas utiliser la méthode d'interface pour obtenir un héritage multiple. , vous pouvez envisager d'utiliser des traits. La mise en œuvre, bien sûr, peut également être réalisée en utilisant le mode combinaison.

Comment utiliser le mode trait ou combinaison pour implémenter l'héritage multiple en PHP

Trait est une nouvelle méthode de réutilisation de code dans PHP 5.4. Trait est un mécanisme de réutilisation de code préparé pour les langages à héritage unique comme PHP. Les traits sont conçus pour réduire les limitations des langages à héritage unique et permettre aux développeurs de réutiliser librement des méthodes dans des classes indépendantes au sein de différentes hiérarchies. La sémantique de la composition des traits et des classes définit un moyen de réduire la complexité et d'éviter les problèmes typiques associés à l'héritage multiple traditionnel et aux classes Mixin.

Trait est similaire à Class, mais est uniquement conçu pour combiner des fonctionnalités de manière fine et cohérente. Ne peut pas être instancié via le trait lui-même. Il ajoute une combinaison de fonctionnalités horizontales à l'héritage traditionnel ; c'est-à-dire qu'il n'est pas nécessaire d'hériter entre plusieurs classes dans une application.

Utilisez généralement le mot-clé use dans une classe pour déclarer le nom du trait à combiner, et la déclaration d'un trait spécifique utilise le mot-clé trait, et le trait ne peut pas être instancié directement.

Le code est le suivant :

<?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
Copier après la connexion

Le code utilise deux traits pour implémenter l'héritage multiple.

Remarque : La même méthode ne peut pas apparaître dans deux traits. S'il existe une méthode portant le même nom, une erreur fatale se produira.

Remarque : Il existe également une méthode aaa dans la classe MyHelloWorld, qui remplacera la méthode aaa dans le trait Hello.

Le code ci-dessus peut également être implémenté via le modèle combiné. Le code est le suivant :

<?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
Copier après la connexion

Évidemment, s'il est implémenté via des traits, la quantité de code est bien moindre et la lisibilité est bien supérieure.

Apprentissage recommandé : Tutoriel vidéo php

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
php
source:csdn.net
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal