X 提示语:您的IE浏览器版本太低,部分重要功能无法体验或使用,请升级到IE8以上或者使用火狐、谷歌浏览器,浏览器下载:IE8火狐浏览器谷歌浏览器
PHP中的traits实现代码复用使用实例
发布时间:2018-11-05 10:52:06    来源:容大互联

PHP5.4后新增traits实现代码复用机制,Trait和类相似,但不能被实例化,无需继承,只需要在类中使用关键词use引入即可,可引入多个Traits,用','隔开。


(1)Trait简单使用


<?php
 
trait A {
  public $var1 = 'test1';
  public function test1() {
    echo 'trait A::test1()';
  }
}
 
trait B {
  public $var2 = 'test2';
  public function test2() {
    echo 'trait B::test2()';
  }
}
 
class C {
  use A,B;
}
 
$c = new C();
echo $c->var1; //test1
$c->test2(); //trait B::test2()

(2)优先级问题
Trait会覆盖继承的方法,当前类会覆盖Trait方法。


trait A {
  public $var1 = 'test';
  public function test() {
    echo 'A::test()';
  }
  public function test1() {
    echo 'A::test1()';
  }
}
 
class B {
  public function test() {
    echo 'B::test()';
  }
  public function test1() {
    echo 'B::test1()';
  }
}
class C extends B{
  use A;
  public function test() {
    echo 'c::test()';
  }
}
 
$c = new C();
$c->test(); //c::test()
$c->test1(); //A::test1()

(3)多个Trait冲突问题
如果没有解决冲突,会产生致命错误;
可用insteadof来明确使用冲突中哪一个方法;
可用as操作符将其中一个冲突方法另起名;


trait A {
  public function test() {
    echo 'A::test()';
  }
}
 
trait B {
  public function test() {
    echo 'B::test()';
  }
}
 
class C {
  use A,B {
    B::test insteadof A;
    B::test as t;
  }
}
 
$c = new C();
$c->test(); //B::test()
$c->t(); //B::test()  可以用as另起名

(4)as可用来修改方法访问控制


trait HelloWorld {
  public function sayHello () {
    echo 'Hello World!' ;
  }
}
 
// 修改 sayHello 的访问控制
class A {
  use HelloWorld { sayHello as protected; }
}
 
// 给方法一个改变了访问控制的别名
// 原版 sayHello 的访问控制则没有发生变化
class B {
  use HelloWorld { sayHello as private myPrivateHello ; }
}
 
$b = new A();
$b->sayHello(); //Fatal error: Call to protected method A::sayHello() from context ''

(5)Trait中使用Trait


trait A {
  public function test1() {
    echo 'test1';
  }
}
 
trait B {
  public function test2() {
    echo 'test2';
  }
}
 
trait C {
  use A,B;
}
 
class D {
  use C;
}
 
$d = new D();
$d->test2(); //test2

(6)Trait支持抽象方法、支持静态方法、不可以直接定义静态变量,但静态变量可被trait方法引用。


trait A {
  public function test1() {
    static $a = 0;
    $a++;
    echo $a;
  }
 
  abstract public function test2(); //可定义抽象方法
}
 
class B {
  use A;
  public function test2() {
 
  }
}
 
$b = new B();
$b->test1(); //1
$b->test1(); //2

(7)Trait可定义属性,但类中不能定义同样名称属性


trait A {
  public $test1;
}
 
class B {
  use A;
  public $test2;
}

 


文章来源:网络。如侵犯你的版权,请联系我们的客服人员,我们会第一时间删除文章。



容大互联推荐阅读:

 

企业网站建设 如何选择空间最合适?

  如今的IDC市场竞争异常激烈和混乱,由于门槛的降低,大量的个人和非专业机构都加入到这个市场,不同商家所提供的产品和服务相差甚远!铺天满地的广告让用户看花了眼,用户往往被广告上所宣称的内容一时蒙骗,最终导致用户利益所损、上当受骗的事件屡见

结合具体案例详细讲述网络营销的奥秘

百度权重查询站长交易友情链接交换网站建设,网站设计,企业建站就找313网络营销已经成为了一把神奇的利器,能帮助各种企业提高他们的品牌知名度和销售量。但许多人都对这一行业抱着非常神秘的感觉,以为和IT相关,就是多么有技术含量多么高科技的事情。

SEOER最常用的百度内部命令详解

可能一提到百度内部命令,很多SEO新手觉得很忙然,平时都用CZ或超级管家查询网站的在百度的表现情况的,肿么百度还有内部命令?不错,百度内部命令是百度提供用于站长对网站在搜索引擎中的表现进行查询的进口或指令。通常SEOER们要用到的百度内部命


本文来自容大互联,专业的云计算数据中心服务商,国家高新技术企业,16年的专业深圳服务器托管、大带宽出售、光纤专线接入、云服务器等行业沉淀,提供高性价比的产品和优秀的技术服务,赢得数十万用户的青睐。

    上一篇:PHP生成json和xml类型接口数据格式     下一篇:php通过exif
为什么选择我们
  • 16年品质

    专业服务团队,16年运营经验,值得信赖
  • 高新企业

    国家高新技术企业,深圳行业唯一
  • 双软企业

    深圳市“双软”企业,技术可靠
  • 全程服务

    7X24小时全程服务,不仅仅只是销售产品