了解PHP中的Trait 特性及作用

了解PHP中的Trait 特性及作用

自 PHP 5.4.0 起,PHP 实现了代码复用的一个方法,称为 traits。

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

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

Trait是在PHP5.4中加入的,它既不是接口也不是类。主要是为了解决单继承语言的限制。是PHP多重继承的一种解决方案。例如,需要同时继承两个 Abstract Class, 这将会是件很麻烦的事情,Trait 就是为了解决这个问题。它能被加入到一个或多个已经存在的类中。它声明了类能做什么(表明了其接口特性),同时也包含了具体实现(表明了其类特性)

简单使用

首先,当然是声明个 Trait,PHP5.4 增加了 trait 关键字

trait first_trait {
function first_method() { /* Code Here */ }
function second_method() { /* Code Here */ }
}

同时,如果要在 Class 中使用该 Trait,那么使用 use 关键字

class first_class {
// 注意这行,声明使用 first_trait
use first_trait;
}
$obj = new first_class();
// Executing the method from trait
$obj->first_method(); // valid
$obj->second_method(); // valid

使用多个 Trait

在同个 Class 中可以使用多个 Trait

trait first_trait
{
function first_method() { echo "method"; }
}
trait second_trait {
function second_method() { echo "method"; }
}
class first_class {
// now using more than one trait
use first_trait, second_trait;
}
$obj= new first_class();
// Valid
$obj->first_method(); // Print : method
// Valid
$obj->second_method(); // Print : method

Trait 之间的嵌套

同时,Trait 之间也可以相互的嵌套,例如

trait first_trait {
function first_method() { echo "method"; }
}
trait second_trait {
use first_trait;
function second_method() { echo "method"; }
}
class first_class {
// now using 
use second_trait;
}
$obj= new first_class();
// Valid
$obj->first_method(); // Print : method
// Valid
$obj->second_method(); // Print : method

Trait 的抽象方法(Abstract Method)

我们可以在 Trait 中声明需要实现的抽象方法,这样能使使用它的 Class 必须实现它

trait first_trait {
function first_method() { echo "method"; }
// 这里可以加入修饰符,说明调用类必须实现它
abstract public function second_method();
}
class first_method {
use first_trait;
function second_method() {
/* Code Here */
}
}

Trait 冲突

多个 Trait 之间同时使用难免会冲突,这需要我们去解决。PHP5.4 从语法方面带入了相关 的关键字语法:insteadof 以及 as ,用法参见

trait first_trait {
function first_function() { 
echo "From First Trait";
}
}
trait second_trait {
// 这里的名称和 first_trait 一样,会有冲突
function first_function() { 
echo "From Second Trait";
}
}
class first_class {
use first_trait, second_trait {
// 在这里声明使用 first_trait 的 first_function 替换
// second_trait 中声明的
first_trait::first_function insteadof second_trait;
}
} 
$obj = new first_class();
// Output: From First Trait
$obj->first_function();

上面就是些 Trait 比较基本的使用了,更详细的可以参考官方手册。这里总结下注意的几 点:

Trait 会覆盖调用类继承的父类方法

Trait 无法如 Class 一样使用 new 实例化

单个 Trait 可由多个 Trait 组成

在单个 Class 中,可以使用多个 Trait

Trait 支持修饰词(modifiers),例如 final、static、abstract

我们能使用 insteadof 以及 as 操作符解决 Trait 之间的冲突

关于了解PHP中的Trait 特性及作用的文章就分享到这,如果对你有帮助欢迎继续关注我们哦

本文来自投稿,不代表重蔚自留地立场,如若转载,请注明出处https://www.cwhello.com/40794.html

如有侵犯您的合法权益请发邮件951076433@qq.com联系删除

(0)
php学习php学习订阅用户
上一篇 2022年6月16日 23:26
下一篇 2022年6月16日 23:26

相关推荐

  • PHP正则表达式常用例子

    "^[0-9]*[1-9][0-9]*$"   //正整数 "^((-\d+)|(0+))$"   //非正整数(负整数 + 0) "^-[0-9]*[1-9][0-9]*$"   //负整数 "^-?\d+$"     //整数 "^\d+(\.\d+)?$"   //非负浮点数(正浮点数 + 0) "^(([0-…

    2018年3月5日
    0331
  • 重蔚php学习第三十二天——利用each和list遍历php数组

    语法 each array each (array $array) 表示将数组中当前元素的信息保存到某个数组中,如果得不到元素信息,返回false,能得到就返回数组 返回的这个数组包含4个数组元素 [1]=当前元素的值 [‘value’]=当前元素的值 […

    2017年10月9日 PHP自学教程
    0238
  • PHP函数的Slim函数。

    PHP是一门非常流行的服务器端脚本语言,在Web开发领域有着广泛的应用。其中,Slim框架是PHP中一个轻量级、灵活、易于学习和使用的开源框架,提供了构建web应用程序所需的基本功能和组件,并且可扩展性强,适用于中…

    2023年5月23日
    00
  • 基于PHP商城网站的移动开放与移动应用

    随着移动互联网的普及,越来越多的消费者开始使用移动设备进行购物。因此,拥有一个移动友好的电子商务网站是很重要的。PHP作为一种广泛使用的编程语言和网站开发工具,可以轻松地满足这种需求。在这篇文章中,我们…

    2023年5月18日
    00
  • php跳出语句-continue

    说明:跳过某次循环 案例:输出1-50,然后在第25次时跳过。 //输出1-50,然后再第25次的时候跳过。 for($i=1;$i<=50;$i++){ if($i==25){ continue; } echo $i .' '; }

    2018年3月8日
    0284
  • 记录之PHP日常注意点(1)

    1,float数据类型输出格式问题$float1 = 1.123;$float2 = 2.3e3;$float3 = 8E-5;var_dump($float1, $float2, $float3); //float(1.123) float(2300) float(8.0E-5)var_dump(number_format(8E-5, 5)); //string(7) &…

    2022年6月19日
    0136
  • php+redis消息队列实现抢购功能

    实现功能: 1. 基于redis队列,防止高并发的超卖 2. 基于mysql的事务加排它锁,防止高并发的超卖 基于redis队列工作流程: 1. 管理员根据goods表中的库存,创建redis商品库存队列 2. 客户端访问秒杀API 3. web服务…

    2018年5月21日
    0243
  • PHP中的面向对象编程。

    PHP是一种非常流行的脚本语言,由于其易学易用、兼容性强以及强大的功能,被广泛应用于Web开发领域。之前,PHP的主流编程方式一直是基于过程式编程的,然而随着时间的推移和市场的不断变化,面向对象编程(OOP)的流…

    2023年5月30日
    00

联系我们

QQ:951076433

在线咨询:点击这里给我发消息邮件:951076433@qq.com工作时间:周一至周五,9:30-18:30,节假日休息