Maison >développement back-end >tutoriel php >Comment utiliser les traits en php

Comment utiliser les traits en php

怪我咯
怪我咯original
2017-07-13 14:59:421456parcourir

Depuis PHP 5.4.0, PHP implémente une méthode de réutilisation de code appelée traits.

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.

Cet article présente principalement comment utiliser les traits en PHP Pour faire simple, le mot-clé trait est utilisé en PHP pour résoudre le problème qu'une classe souhaite intégrer les attributs. et Method , mais je souhaite également avoir d'autres méthodes de classe de base, et le trait est généralement utilisé en conjonction avec use.

<?php
  trait Drive {
    public $carName = &#39;trait&#39;;
    public function driving() {
      echo "driving {$this->carName}\n";
    }
  }
  class Person {
    public function eat() {
      echo "eat\n";
    }
  }
  class Student extends Person {
    use Drive;
    public function study() {
      echo "study\n";
    }
  }
  $student = new Student();
  $student->study();
  $student->eat();
  $student->driving();

?>

Les résultats de sortie sont les suivants :

study
eat
driving trait

Dans l'exemple ci-dessus, la classe Student hérite de Person et a la méthode eat En combinant Drive, elle a. la méthode de conduite et la propriété carName.

S'il y a une propriété ou méthode du même nom dans Trait, classe de base et cette classe, laquelle sera retenue au final ?

<?php 
  trait Drive {
    public function hello() {
      echo "hello drive\n";
    }
    public function driving() {
      echo "driving from drive\n";
    }
  }
  class Person {
    public function hello() {
      echo "hello person\n";
    }
    public function driving() {
      echo "driving from person\n";
    }
  }
  class Student extends Person {
    use Drive;
    public function hello() {
      echo "hello student\n";
    }
  }
  $student = new Student();
  $student->hello();
  $student->driving();
?>

Les résultats de sortie sont les suivants :

hello student
driving from drive

Il est donc conclu que lorsqu'une méthode ou un attribut porte le même nom, la méthode de la classe actuelle remplacera le trait méthode, et la méthode du trait remplacera la méthode dans la classe de base.

Si vous souhaitez combiner plusieurs Traits, séparez les noms des Traits par des virgules :

use Trait1, Trait2;

Que se passe-t-il si plusieurs Traits contiennent des méthodes ou des propriétés portant le même nom ? La réponse est que lorsque plusieurs traits combinés contiennent des propriétés ou des méthodes portant le même nom, ils doivent être explicitement déclarés pour résoudre les conflits, sinon une erreur fatale se produira.

<?php
trait Trait1 {
  public function hello() {
    echo "Trait1::hello\n";
  }
  public function hi() {
    echo "Trait1::hi\n";
  }
}
trait Trait2 {
  public function hello() {
    echo "Trait2::hello\n";
  }
  public function hi() {
    echo "Trait2::hi\n";
  }
}
class Class1 {
  use Trait1, Trait2;
}
?>

Les résultats de sortie sont les suivants :

PHP Fatal error:  Trait method hello has not been applied, because there are collisions with other trait methods on Class1 in ~/php54/trait_3.php on line 20

Utiliser à la place de et en tant queopérateurs pour résoudre les conflits au lieu de utilise une méthode pour en remplacer une autre, et comme. Il s'agit de donner un alias à la méthode. Veuillez consulter le code pour une utilisation spécifique :

<?php
trait Trait1 {
  public function hello() {
    echo "Trait1::hello\n";
  }
  public function hi() {
    echo "Trait1::hi\n";
  }
}
trait Trait2 {
  public function hello() {
    echo "Trait2::hello\n";
  }
  public function hi() {
    echo "Trait2::hi\n";
  }
}
class Class1 {
  use Trait1, Trait2 {
    Trait2::hello insteadof Trait1;
    Trait1::hi insteadof Trait2;
  }
}
class Class2 {
  use Trait1, Trait2 {
    Trait2::hello insteadof Trait1;
    Trait1::hi insteadof Trait2;
    Trait2::hi as hei;
    Trait1::hello as hehe;
  }
}
$Obj1 = new Class1();
$Obj1->hello();
$Obj1->hi();
echo "\n";
$Obj2 = new Class2();
$Obj2->hello();
$Obj2->hi();
$Obj2->hei();
$Obj2->hehe();
?>

Le résultat de sortie est le suivant :

Trait2::hello
Trait1::hi

Trait2::hello
Trait1::hi
Trait2::hi
Trait1::hello

Le mot-clé as a une autre utilisation, qui consiste à modifier la méthodeContrôle d'accès :

Trait peut également être combiné avec Trait. Trait prend en charge les méthodes abstraites, les propriétés statiques et les méthodes statiques. suit :

<?php
trait Hello {
  public function sayHello() {
    echo "Hello\n";
  }
}
trait World {
  use Hello;
  public function sayWorld() {
    echo "World\n";
  }
  abstract public function getWorld();
  public function inc() {
    static $c = 0;
    $c = $c + 1;
    echo "$c\n";
  }
  public static function doSomething() {
    echo "Doing something\n";
  }
}
class HelloWorld {
  use World;
  public function getWorld() {
    return &#39;get World&#39;;
  }
}
$Obj = new HelloWorld();
$Obj->sayHello();
$Obj->sayWorld();
echo $Obj->getWorld() . "\n";
HelloWorld::doSomething();
$Obj->inc();
$Obj->inc();
?>

Les résultats de sortie sont les suivants :

Hello
World
get World
Doing something
1
2

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!

Déclaration:
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