Membres abstraits de Trait
Afin d'imposer des exigences sur les classes utilisées, les traits prennent en charge l'utilisation de méthodes abstraites.
Représente un exemple d'application d'exigences via des méthodes abstraites
<?php trait Hello { public function sayHelloWorld() { echo 'Hello'.$this->getWorld(); } abstract public function getWorld(); } class MyHelloWorld { private $world; use Hello; public function getWorld() { return $this->world; } public function setWorld($val) { $this->world = $val; } } ?>
Les statiquesmembres
Les traits peuvent être des membres statiques définition de méthode statique.
StatiqueExemples de variables
<?php trait Counter { public function inc() { static $c = 0; $c = $c + 1; echo "$c\n"; } } class C1 { use Counter; } class C2 { use Counter; } $o = new C1(); $o->inc(); // echo 1 $p = new C2(); $p->inc(); // echo 1 ?>
Exemples de méthodes statiques
<?php trait StaticExample { public static function doSomething() { return 'Doing something'; } } class Example { use StaticExample; } Example::doSomething(); ?>
Exemples de variables statiques et de méthodes statiques
<?php trait Counter { public static $c = 0; public static function inc() { self::$c = self::$c + 1; echo self::$c . "\n"; } } class C1 { use Counter; } class C2 { use Counter; } C1::inc(); // echo 1 C2::inc(); // echo 1 ?>
Le trait peut également définir des attributs.
Exemple de définition d'attributs
<?php trait PropertiesTrait { public $x = 1; } class PropertiesExample { use PropertiesTrait; } $example = new PropertiesExample; $example->x; ?>
Si un trait définit un attribut, la classe ne pourra pas définir un attribut du même nom, sinon une erreur sera générée. Si la définition de la propriété dans la classe est compatible avec sa définition dans le trait (même visibilité et valeur initiale) le niveau d'erreur est E_STRICT, sinon c'est une erreur fatale.
Exemples de conflits
<?php trait PropertiesTrait { public $same = true; public $different = false; } class PropertiesExample { use PropertiesTrait; public $same = true; // Strict Standards public $different = true; // 致命错误 } ?>
Différences d'utilisation
Exemples d'utilisations différentes
<?php namespace Foo\Bar; use Foo\Test; // means \Foo\Test - the initial \ is optional ?> <?php namespace Foo\Bar; class SomeClass { use Foo\Test; // means \Foo\Bar\Foo\Test } ?>
La première utilisation est l'utilisation pour l'espace de noms FooTest, ce que l'on trouve est FooTest, la deuxième utilisation est d'utiliser un trait, ce que l'on trouve est FooBarFooTest.
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!