php trait 简明教程,多重继承的实现方案

WBOY
Release: 2016-06-23 13:12:56
Original
1005 people have browsed it

http://php.net/manual/en/language.oop5.traits.php

自PHP5.4.0起,PHP实现了代码复用的一个方法,称为traints。

Traits是一种为类似PHP的单继承语音而准备的代码复用机制。Trait为了减少单继承语句的限制,使开发人员能够自由地在不同层次结构内独立的类中复用方法集。Traits和类组合的语义是定义一种方法来减少复杂性,避免传统继承和混入类(Mixin)相关的典型问题。

Traits和一个类相似,但仅仅旨在用细粒度和一的方式来组合功能。Trait不能通过它自身来实例化。它为传统继承增加了水平特性的组合;也就是说,应用类的成员不需要继承。

在我理解说白了就是在继承类链中隔离了子类继承父类的某些特性(就是子类“要用父类的特性的时候”,如果trait有,就优先调用trait的方法、属性等)。

<pre class="scode"><?php/** * Date: 2016/3/28 * Time: 16:38 */trait MyTrait{    protected $var = "MyTrait_var";    protected $var1 = "MyTrait_var";    function __construct()    {        echo $this->var.PHP_EOL;    }    function a()    {        echo "a".PHP_EOL;    }}interface MyInterface{    function __construct();    function b();}abstract class MyAbstract{    protected $var2 = "MyAbstract_var";    use MyTrait;    function b()    {        echo "b".PHP_EOL;    }}class MyClass extends MyAbstract implements MyInterface{    protected $var3 = "MyClass_var";    //也可以在这里引用,不区分继承关系    //use MyTrait    function c()    {        echo "c".PHP_EOL;    }}$class = new MyClass();$class->a();$class->b();$class->c();
Copy after login




输出结果:

总结

① 从本质上说,trait和include文件的概念差不多

②trait可以更加方便的实现代码复用,因为我们用继承关系实现的无法在父类中访问子类的private属性与方法,而trait就和把代码直接写在对象里的效果一样

③使用trait时候应该坚决避免命名冲突,尤其是同时使用多个trait时。

④如果产生了命名冲突,如果两者的可见性、初始值、static与否完全相同,则trait中的会覆盖掉对象中的,并抛出E_STRICT错误,否则会抛出E_COMPILE_ERROR错误,终止编译。

source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template