Table des matières
PHP的学习--Traits新特性
Maison développement back-end tutoriel php PHP的学习--Traits新特性_PHP教程

PHP的学习--Traits新特性_PHP教程

Jul 13, 2016 am 10:11 AM
特性

PHP的学习--Traits新特性

 
 
自 PHP 5.4.0 起,PHP 实现了代码复用的一个方法,称为 traits。
 
Traits 是一种为类似 PHP 的单继承语言而准备的代码复用机制。Trait 为了减少单继承语言的限制,使开发人员能够自由地在不同层次结构内独立的类中复用方法集。Traits 和类组合的语义是定义了一种方式来减少复杂性,避免传统多继承和混入类(Mixin)相关的典型问题。
 
Trait 和一个类相似,但仅仅旨在用细粒度和一致的方式来组合功能。Trait 不能通过它自身来实例化。它为传统继承增加了水平特性的组合;也就是说,应用类的成员不需要继承。
 
Trait 示例
 
 
trait ezcReflectionReturnInfo {
    function getReturnType() { /*1*/ }
    function getReturnDescription() { /*2*/ }
}
 
class ezcReflectionMethod extends ReflectionMethod {
    use ezcReflectionReturnInfo;
    /* ... */
}
 
class ezcReflectionFunction extends ReflectionFunction {
    use ezcReflectionReturnInfo;
    /* ... */
}
?>
 
优先级
从基类继承的成员被 trait 插入的成员所覆盖。优先顺序是来自当前类的成员覆盖了 trait 的方法,而 trait 则覆盖了被继承的方法。
 
优先顺序示例
 
 
class Base {
    public function sayHello() {
        echo 'Hello ';
    }
}
 
trait SayWorld {
    public function sayHello() {
        parent::sayHello();
        echo 'World!';
    }
}
 
class MyHelloWorld extends Base {
    use SayWorld;
}
 
$o = new MyHelloWorld();
$o->sayHello();
?>
 
以上例程会输出:Hello World!
 
从基类继承的成员被插入的 SayWorld Trait 中的 sayHello 方法所覆盖。其行为 MyHelloWorld 类中定义的方法一致。优先顺序是当前类中的方法会覆盖 trait 方法,而 trait 方法又覆盖了基类中的方法。
 
另一个优先级顺序的例子
 
 
trait HelloWorld {
    public function sayHello() {
        echo 'Hello World!';
    }
}
 
class TheWorldIsNotEnough {
    use HelloWorld;
    public function sayHello() {
        echo 'Hello Universe!';
    }
}
 
$o = new TheWorldIsNotEnough();
$o->sayHello();
?>
 
以上例程会输出:Hello Universe!
 
多个 trait
通过逗号分隔,在 use 声明列出多个 trait,可以都插入到一个类中。
 
多个 trait 的用法的例子
 
 
trait Hello {
    public function sayHello() {
        echo 'Hello ';
    }
}
 
trait World {
    public function sayWorld() {
        echo 'World';
    }
}
 
class MyHelloWorld {
    use Hello, World;
    public function sayExclamationMark() {
        echo '!';
    }
}
 
$o = new MyHelloWorld();
$o->sayHello();
$o->sayWorld();
$o->sayExclamationMark();
?>
 
以上例程会输出:Hello World!
 
冲突的解决
如果两个 trait 都插入了一个同名的方法,如果没有明确解决冲突将会产生一个致命错误。
 
为了解决多个 trait 在同一个类中的命名冲突,需要使用 insteadof 操作符来明确指定使用冲突方法中的哪一个。
 
以上方式仅允许排除掉其它方法,as 操作符可以将其中一个冲突的方法以另一个名称来引入。
 
冲突解决的例子
 
 
trait A {
    public function smallTalk() {
        echo 'a';
    }
    public function bigTalk() {
        echo 'A';
    }
}
 
trait B {
    public function smallTalk() {
        echo 'b';
    }
    public function bigTalk() {
        echo 'B';
    }
}
 
class Talker {
    use A, B {
        B::smallTalk insteadof A;
        A::bigTalk insteadof B;
    }
}
 
class Aliased_Talker {
    use A, B {
        B::smallTalk insteadof A;
        A::bigTalk insteadof B;
        B::bigTalk as talk;
    }
}
?>
 
在本例中 Talker 使用了 trait A 和 B。由于 A 和 B 有冲突的方法,其定义了使用 trait B 中的 smallTalk 以及 trait A 中的 bigTalk。
 
Aliased_Talker 使用了 as 操作符来定义了 talk 来作为 B 的 bigTalk 的别名。
 
修改方法的访问控制
使用 as 语法还可以用来调整方法的访问控制。
 
修改方法的访问控制的例子
 
 
trait HelloWorld {
    public function sayHello() {
        echo 'Hello World!';
    }
}
 
// 修改 sayHello 的访问控制
class MyClass1 {
    use HelloWorld { sayHello as protected; }
}
 
// 给方法一个改变了访问控制的别名
// 原版 sayHello 的访问控制则没有发生变化
class MyClass2 {
    use HelloWorld { sayHello as private myPrivateHello; }
}
?>
 
从 trait 来组成 trait
正如类能够使用 trait 一样,其它 trait 也能够使用 trait。在 trait 定义时通过使用一个或多个 trait,它能够组合其它 trait 中的部分或全部成员。
 
从 trait 来组成 trait的例子
 
 
trait Hello {
    public function sayHello() {
        echo 'Hello ';
    }
}
 
trait World {
    public function sayWorld() {
        echo 'World!';
    }
}
 
trait HelloWorld {
    use Hello, World;
}
 
class MyHelloWorld {
    use HelloWorld;
}
 
$o = new MyHelloWorld();
$o->sayHello();
$o->sayWorld();
?>
 
以上例程会输出:Hello World!
 
Trait 的抽象成员
为了对使用的类施加强制要求,trait 支持抽象方法的使用。
 
表示通过抽象方法来进行强制要求的例子
 
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;
    }
}
?>
 
Trait 的静态成员
Traits 可以被静态成员静态方法定义。
 
静态变量的例子
 
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
?>
 
静态方法的例子
 
 
trait StaticExample {
    public static function doSomething() {
        return 'Doing something';
    }
}
 
class Example {
    use StaticExample;
}
 
Example::doSomething();
?>
 
静态变量和静态方法的例子
 
 
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
?>
 
属性
Trait 同样可以定义属性。
 
定义属性的例子
 
 
trait PropertiesTrait {
    public $x = 1;
}
 
class PropertiesExample {
    use PropertiesTrait;
}
 
$example = new PropertiesExample;
$example->x;
?>
 
如果 trait 定义了一个属性,那类将不能定义同样名称的属性,否则会产生一个错误。如果该属性在类中的定义与在 trait 中的定义兼容(同样的可见性和初始值)则错误的级别是 E_STRICT,否则是一个致命错误。
 
冲突的例子
 
 
trait PropertiesTrait {
    public $same = true;
    public $different = false;
}
 
class PropertiesExample {
    use PropertiesTrait;
    public $same = true; // Strict Standards
    public $different = true; // 致命错误
}
?>
 
Use的不同
不同use的例子
 
namespace Foo\Bar;
use Foo\Test;  // means \Foo\Test - the initial \ is optional
?>
 
namespace Foo\Bar;
class SomeClass {
    use Foo\Test;   // means \Foo\Bar\Foo\Test
}
?>
 
第一个use是用于 namespace 的 use Foo\Test,找到的是 \Foo\Test,第二个 use 是使用一个trait,找到的是\Foo\Bar\Foo\Test。
 
__CLASS__和__TRAIT__
__CLASS__ 返回 use trait 的 class name,__TRAIT__返回 trait name
 
 
 
 
trait TestTrait {
    public function testMethod() {
        echo "Class: " . __CLASS__ . PHP_EOL;
        echo "Trait: " . __TRAIT__ . PHP_EOL;
    }
}
 
class BaseClass {
    use TestTrait;
}
 
class TestClass extends BaseClass {
 
}
 
$t = new TestClass();
$t->testMethod();
 
//Class: BaseClass
//Trait: TestTrait
 
Trait单例
 
 
 
 
trait singleton {    
    /**
     * private construct, generally defined by using class
     */
    //private function __construct() {}
    
    public static function getInstance() {
        static $_instance = NULL;
        $class = __CLASS__;
        return $_instance ?: $_instance = new $class;
    }
    
    public function __clone() {
        trigger_error('Cloning '.__CLASS__.' is not allowed.',E_USER_ERROR);
    }
    
    public function __wakeup() {
        trigger_error('Unserializing '.__CLASS__.' is not allowed.',E_USER_ERROR);
    }
}
 
/**
* Example Usage
*/
 
class foo {
    use singleton;
    
    private function __construct() {
        $this->name = 'foo';
    }
}
 
class bar {
    use singleton;
    
    private function __construct() {
        $this->name = 'bar';
    }
}
 
$foo = foo::getInstance();
echo $foo->name;
 
$bar = bar::getInstance();
echo $bar->name;
 
调用trait方法
虽然不很明显,但是如果Trait的方法可以被定义为在普通类的静态方法,就可以被调用
 
实例如下
 
trait Foo { 
    function bar() { 
        return 'baz'; 
    } 
 
echo Foo::bar(),"\\n"; 

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/927607.htmlTechArticlePHP的学习--Traits新特性 自 PHP 5.4.0 起,PHP 实现了代码复用的一个方法,称为 traits。 Traits 是一种为类似 PHP 的单继承语言而准备的代码复用...
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

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Comment déverrouiller tout dans Myrise
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Introduction aux différences entre la version Win7 Home et la version Win7 Ultimate Introduction aux différences entre la version Win7 Home et la version Win7 Ultimate Jul 12, 2023 pm 08:41 PM

Tout le monde sait qu'il existe de nombreuses versions du système Win7, telles que la version Win7 Ultimate, la version Win7 Professional, la version Win7 Home, etc. De nombreux utilisateurs sont coincés entre la version Home et la version Ultimate et ne savent pas quelle version choisir. alors aujourd'hui, je vais vous parler des différences entre Win7 Family Meal et Win7 Ultimate. Jetons un coup d'œil. 1. Experience Different Home Basic Edition rend vos opérations quotidiennes plus rapides et plus simples et vous permet d'accéder plus rapidement et plus facilement à vos programmes et documents les plus fréquemment utilisés. Home Premium vous offre la meilleure expérience de divertissement, permettant de profiter et de partager facilement vos émissions de télévision, photos, vidéos et musiques préférées. L'Ultimate Edition intègre toutes les fonctions de chaque édition et possède toutes les fonctions de divertissement et fonctionnalités professionnelles de Windows 7 Home Premium.

Maîtriser les concepts clés de Spring MVC : comprendre ces fonctionnalités importantes Maîtriser les concepts clés de Spring MVC : comprendre ces fonctionnalités importantes Dec 29, 2023 am 09:14 AM

Comprendre les fonctionnalités clés de SpringMVC : pour maîtriser ces concepts importants, des exemples de code spécifiques sont nécessaires. SpringMVC est un cadre de développement d'applications Web basé sur Java qui aide les développeurs à créer des structures flexibles et évolutives via le modèle architectural Model-View-Controller (MVC). application Web. Comprendre et maîtriser les fonctionnalités clés de SpringMVC nous permettra de développer et de gérer nos applications Web plus efficacement. Cet article présentera quelques concepts importants de SpringMVC

Choisissez la version Go applicable, en fonction des besoins et des fonctionnalités Choisissez la version Go applicable, en fonction des besoins et des fonctionnalités Jan 20, 2024 am 09:28 AM

Avec le développement rapide d'Internet, les langages de programmation évoluent et se mettent à jour constamment. Parmi eux, le langage Go, en tant que langage de programmation open source, a attiré beaucoup d'attention ces dernières années. Le langage Go est conçu pour être simple, efficace, sûr et facile à développer et à déployer. Il présente les caractéristiques d'une concurrence élevée, d'une compilation rapide et d'une sécurité de la mémoire, ce qui le rend largement utilisé dans des domaines tels que le développement Web, le cloud computing et le big data. Cependant, il existe actuellement différentes versions du langage Go disponibles. Lors du choix d’une version linguistique Go appropriée, nous devons prendre en compte à la fois les exigences et les fonctionnalités. tête

Quelles sont les trois caractéristiques de la 5g Quelles sont les trois caractéristiques de la 5g Dec 09, 2020 am 10:55 AM

Les trois caractéristiques de la 5G sont : 1. Haut débit ; dans les applications pratiques, la vitesse du réseau 5G est plus de 10 fois supérieure à celle du réseau 4G. 2. Faible latence : la latence du réseau 5G est d'environ plusieurs dizaines de millisecondes, ce qui est plus rapide que la vitesse de réaction humaine. 3. Une connexion étendue ; l’émergence du réseau 5G, combinée à d’autres technologies, créera une nouvelle scène de l’Internet des objets.

Existe-t-il des fonctionnalités orientées objet de type classe dans Golang ? Existe-t-il des fonctionnalités orientées objet de type classe dans Golang ? Mar 19, 2024 pm 02:51 PM

Il n'y a pas de concept de classe au sens traditionnel dans Golang (langage Go), mais il fournit un type de données appelé structure, à travers lequel des fonctionnalités orientées objet similaires aux classes peuvent être obtenues. Dans cet article, nous expliquerons comment utiliser les structures pour implémenter des fonctionnalités orientées objet et fournirons des exemples de code concrets. Définition et utilisation des structures Examinons d'abord la définition et l'utilisation des structures. Dans Golang, les structures peuvent être définies via le mot-clé type, puis utilisées si nécessaire. Les structures peuvent contenir des attributs

Types et caractéristiques des fonctions C++ Types et caractéristiques des fonctions C++ Apr 11, 2024 pm 03:30 PM

Les fonctions C++ ont les types suivants : fonctions simples, fonctions const, fonctions statiques et fonctions virtuelles ; les fonctionnalités incluent : les fonctions en ligne, les paramètres par défaut, les retours de référence et les fonctions surchargées. Par exemple, la fonction calculateArea utilise π pour calculer l'aire d'un cercle d'un rayon donné et la renvoie en sortie.

Quelles sont les caractéristiques de Java Quelles sont les caractéristiques de Java Aug 09, 2023 pm 03:05 PM

Les caractéristiques de Java sont : 1. Simple et facile à apprendre 2. Orienté objet, rendant le code plus réutilisable et maintenable 3. Indépendant de la plate-forme, capable de fonctionner sur différents systèmes d'exploitation 4. Gestion de la mémoire, via des déchets automatiques ; mécanisme de collecte Gérer la mémoire 5. Vérification de type forte, les variables doivent déclarer leur type avant utilisation 6. Sécurité, qui peut empêcher l'accès non autorisé et l'exécution de code malveillant 7. Prise en charge du multithread, qui peut améliorer les performances et la réactivité du programme ; 8. La gestion des exceptions peut éviter les plantages du programme ; 9. Un grand nombre de bibliothèques et de frameworks de développement ;

Maîtriser les fonctionnalités clés et les scénarios d'application du middleware Golang Maîtriser les fonctionnalités clés et les scénarios d'application du middleware Golang Mar 20, 2024 pm 06:33 PM

En tant que langage de programmation rapide et efficace, Golang est également largement utilisé dans le domaine du développement Web. Parmi eux, le middleware, en tant que modèle de conception important, peut aider les développeurs à mieux organiser et gérer le code, et à améliorer la réutilisabilité et la maintenabilité du code. Cet article présentera les principales fonctionnalités et scénarios d'application du middleware dans Golang, et illustrera son utilisation à travers des exemples de code spécifiques. 1. Le concept et la fonction du middleware En tant que composant plug-in, le middleware se situe dans la chaîne de traitement requête-réponse de l'application.

See all articles