自PHP5.4.0起,PHP实现了一种代码复用的方法,称为trait。
众所周知,PHP中是单继承的,trait是为类似PHP的单继承语言而准备得一种代码复用机制。trait为了减少单继承语言的限制,使开发人员能够自由地在不同层次结构内独立的类中复用method。trait和class组合的语义定义了一种减少复杂性的方式,避免传统多继承问题。
trait和class相似,但仅仅在用细粒度和一致的方式来组合功能。无法通过trait自身来实例化。它为传统继承增加了水平特性的组合;也就是说,应用的几个class之间不需要继承。
简单的例子
首先我们举个例子来介绍trait,和类定义相似,但使用关键字trait定义。在类中使用use组合。
<?php
trait T{
public function t1(){
return 't1';
}
public function t2(){
return 't2';
}
}
class Demo{
use T;
public function test(){
return 'test';
}
}
$demo = new Demo;
echo $demo->t1(),'</br>';
echo $demo->test();
输出结果:
多个trait冲突解决
?如果使用多个trait,但是出现了方法名相同,这就出现了冲突,就要手动指定使用哪个trait的方法,使用insteadof关键字实现。
<?php
trait T{
public function t1(){
return 't1';
}
public function t2(){
return 't2';
}
}
trait T2{
public function t1(){
return 't3';
}
}
class Demo{
use T,T2{
//使用T的m1方法
T::t1 insteadof T2;
}
public function test(){
return 'test';
}
}
$demo = new Demo;
echo $demo->t1(),'</br>';
echo $demo->test();
输出结果:
??在冲突的时候,也可以使用use定义方法别名解决冲突,例子如下:
<?php
trait T{
public function t1(){
return 't1';
}
public function t2(){
return 't2';
}
}
trait T2{
public function t1(){
return 't3';
}
}
class Demo{
use T,T2{
//使用T的m1方法
T::t1 insteadof T2;
T2::t1 as new_t1;
}
public function test(){
return 'test';
}
}
$demo = new Demo;
echo $demo->t1(),'</br>';
echo $demo->new_t1(),'</br>';
echo $demo->test();
输出结果:
改变访问权限
??也可以使用use关键字来改变方法的访问权限。
<?php
trait T{
public function t1(){
return 't1';
}
public function t2(){
return 't2';
}
}
class Demo{
use T{
t2 as protected;
}
public function test(){
return 'test';
}
}
$demo = new Demo;
echo $demo->t1(),'</br>';
echo $demo->t2(),'</br>';
echo $demo->test();
输出结果:
上面只是介绍了一些常用的特性,详细可参考官方手册: https://php.net/manual/zh/language.oop5.traits.php
自PHP5.4.0起,PHP实现了一种代码复用的方法,称为trait。
众所周知,PHP中是单继承的,trait是为类似PHP的单继承语言而准备得一种代码复用机制。trait为了减少单继承语言的限制,使开发人员能够自由地在不同层次结构内独立的类中复用method。trait和class组合的语义定义了一种减少复杂性的方式,避免传统多继承问题。
trait和class相似,但仅仅在用细粒度和一致的方式来组合功能。无法通过trait自身来实例化。它为传统继承增加了水平特性的组合;也就是说,应用的几个class之间不需要继承。
简单的例子
首先我们举个例子来介绍trait,和类定义相似,但使用关键字trait定义。在类中使用use组合。
<?php
trait T{
public function t1(){
return 't1';
}
public function t2(){
return 't2';
}
}
class Demo{
use T;
public function test(){
return 'test';
}
}
$demo = new Demo;
echo $demo->t1(),'</br>';
echo $demo->test();
输出结果:
多个trait冲突解决
?如果使用多个trait,但是出现了方法名相同,这就出现了冲突,就要手动指定使用哪个trait的方法,使用insteadof关键字实现。
<?php
trait T{
public function t1(){
return 't1';
}
public function t2(){
return 't2';
}
}
trait T2{
public function t1(){
return 't3';
}
}
class Demo{
use T,T2{
//使用T的m1方法
T::t1 insteadof T2;
}
public function test(){
return 'test';
}
}
$demo = new Demo;
echo $demo->t1(),'</br>';
echo $demo->test();
输出结果:
??在冲突的时候,也可以使用use定义方法别名解决冲突,例子如下:
<?php
trait T{
public function t1(){
return 't1';
}
public function t2(){
return 't2';
}
}
trait T2{
public function t1(){
return 't3';
}
}
class Demo{
use T,T2{
//使用T的m1方法
T::t1 insteadof T2;
T2::t1 as new_t1;
}
public function test(){
return 'test';
}
}
$demo = new Demo;
echo $demo->t1(),'</br>';
echo $demo->new_t1(),'</br>';
echo $demo->test();
输出结果:
改变访问权限
??也可以使用use关键字来改变方法的访问权限。
<?php
trait T{
public function t1(){
return 't1';
}
public function t2(){
return 't2';
}
}
class Demo{
use T{
t2 as protected;
}
public function test(){
return 'test';
}
}
$demo = new Demo;
echo $demo->t1(),'</br>';
echo $demo->t2(),'</br>';
echo $demo->test();
输出结果:
上面只是介绍了一些常用的特性,详细可参考官方手册: https://php.net/manual/zh/language.oop5.traits.php
原文链接:https://www.cnblogs.com/shengChristine/p/10856118.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有