资讯专栏INFORMATION COLUMN

玩转PHP的Trait

hikui / 671人阅读

摘要:语言的一个问题是单继承,这意味着类只能继承一个其他的类。然而,很多情况下需要多继承,比如继承多个类的方法,以防止代码的重复。和组合的语义定义了一种减少复杂性的方式,避免传统多继承问题。是一组方法,可以包含在类中进行使用,单不可实例化。

PHP语言的一个问题是单继承,这意味着类只能继承一个其他的类。然而,很多情况下需要多继承,比如继承多个类的方法,以防止代码的重复。对于但继承模式好还是多继承模式好,不在本文探讨范围内。

为了解决PHP语言单继承存在的不足,在PHP 5.4 中添加了新特性 trait,Trait 是一种代码复用机制,为了减少单继承语言的限制,使开发人员能够自由地在不同层次结构内独立的类中复用 method。Trait 和 Class 组合的语义定义了一种减少复杂性的方式,避免传统多继承问题。

Trait是一组方法,可以包含在类中进行使用,单trait不可实例化。

trait Sharable {

public function share($item)
{
return "share this item";
}

}

你可以在其他类中包含这个trait

class Post {

use Sharable;

}

class Comment {

use Sharable;

}

如果你实例化上面的类,就可以调用trait中的方法

$post = new Post;
echo $post->share(""); // "share this item"

$comment = new Comment;
echo $comment->share(""); // "share this item"

解析上面例子是如何工作的:

例子中的Post 和 Comment 的实例都成功调用了方法share(),尽管类本身没有share()方法,就是因为类中使用了trait Shareable.

trait的基本原理就是在运行时“复制和粘贴"了方法代码,即将trait复制到Post和Comment类中,当你实例化对象时,share()方法就可以使用了。

总结:
Trait 无法如 Class 一样使用 new 实例化
单个 Trait 可由多个 Trait 组成
在单个 Class 中,可以使用多个 Trait
使用trait时候应该坚决避免命名冲突,尤其是同时使用多个trait时。

上篇文章: 我在北京写代码 ,你在哪儿?

扫描关注微信公众号:专注PHP学习

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/22350.html

相关文章

  • PHP 特性之 trait (一)

    摘要:在阅读文档的时候看到一个类是以声明的。是一种代码复用技术,为的单继承限制提供了一套灵活的代码复用机制。下面把的代码做一个修改以上代码会输出。可以看出优先级的顺序为,当前类的优先级基类。   在阅读laravel文档的时候看到一个类 是以 Trait声明的。平时在工作中从来没有用过,于是就去看了下官方文档。原来这个类早在php5.4.0就有了。可惜在项目中从来没有用过。   Trait看...

    ermaoL 评论0 收藏0
  • 关于PHPTrait特性

    摘要:关于作者程序开发人员,不拘泥于语言与技术,目前主要从事和前端开发,使用和,端使用混合式开发。和组合的语义定义了一种减少复杂性的方式,避免传统多继承和类相关典型问题。它为传统继承增加了水平特性的组合也就是说,应用的几个之间不需要继承。 关于作者 程序开发人员,不拘泥于语言与技术,目前主要从事PHP和前端开发,使用Laravel和VueJs,App端使用Apicloud混合式开发。合适和...

    wind3110991 评论0 收藏0
  • php 代码复用机制--traits

    摘要:是一种为类似的单继承语言而准备的代码复用机制。因为中的变量环境是基于函数的,所以会输出博客链接代码复用机制,本文后续如有更新将会在博客更新。 提到 php 的代码复用,我们可能第一时间会想到继承,但是这种单继承语言一旦派生的子类过多,那么会产生一系列的问题,比如依赖父类、耦合性太大、破坏了类的封装性。那么有没有更好的方法来实现代码复用呢? 自 PHP 5.4.0 起,PHP 实现了另外...

    yedf 评论0 收藏0
  • 简述我所理解 PHP Trait

    摘要:和组合的语义定义了一种减少复杂性的方式,避免传统多继承和类相关典型问题。队列的目的是将耗时的任务延时处理,比如发送邮件,从而大幅度缩短请求和相应的时间。同样的道理,根据引入不同的来完成对应的功能。 showImg(https://segmentfault.com/img/remote/1460000010868178); Trait 概念 在常规的 PHP 开发中,我们都习惯于先编写一...

    gecko23 评论0 收藏0
  • php易错笔记-类与对象,命名空间

    摘要:类与对象基本概念如果在之后跟着的是一个包含有类名的字符串,则该类的一个实例被创建。如果该类属于一个名字空间,则必须使用其完整名称。如果一个类被声明为,则不能被继承。命名空间通过关键字来声明。 类与对象 基本概念 new:如果在 new 之后跟着的是一个包含有类名的字符串,则该类的一个实例被创建。如果该类属于一个名字空间,则必须使用其完整名称。 Example #3 创建一个实例 ...

    MartinHan 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<