php中trait的使用

php中trait的使用

1、php中的trait是啥?

看上去既像类又像接口,其实都不是,Trait可以看做类的部分实现,可以混入一个或多个现有的PHP类中,其作用有两个:表明类可以做什么;提供模块化实现。Trait是一种代码复用技术,为PHP的单继承限制提供了一套灵活的代码复用机制。

2、PHP版本要求:
php5.4开始引入trait,其目的就是在于减少代码的重复,增加代码的复用性。

3、trait的使用场景:
试想这样一种情况,当有一个方法需要在很多的类中使用时,该怎么处理?
通常一般的处理方式会是,写一个基础类,在基类中实现这个方法,然后所有类都继承这个基类。

这是一种处理方法,但不是最好的处理方式。通常采用继承的情况是:几个类具有很大的相似性。比如人作为一个基类,学生、工人、等继承“人”这个基类来扩展。

由此,trait的作用就出来了,trait 可以在多个类中使用。

4、trait如何使用:
引用PHP手册中的例子:

例子一

<?php
trait ezcReflectionReturnInfo {
function getReturnType() { /*1*/ }
function getReturnDescription() { /*2*/ }
}

class ezcReflectionMethod extends ReflectionMethod {
use ezcReflectionReturnInfo;
/* ... */
}

class ezcReflectionFunction extends ReflectionFunction {
use ezcReflectionReturnInfo;
/* ... */
}
?>

1、先声明一个trait;
2、在类中使用use将该trait引入。
是不是非常简单(手动逃)?需要注意的是trait的优先级。

5、trait的优先级

(敲黑板)从基类继承的成员会被 trait 插入的成员所覆盖。优先顺序是来自当前类的成员覆盖了 trait 的方法,而 trait 则覆盖了被继承的方法。

优先级:自身方法>trait的方法>继承的方法(就是这样子的。)

看例子

<?php
trait HelloWorld {
public function sayHello() {
echo 'Hello World!';
}
}

class TheWorldIsNotEnough {
use HelloWorld;
public function sayHello() {
echo 'Hello Universe!';
}
}

$o = new TheWorldIsNotEnough();
$o->sayHello();//输出是 Hello Universe!
?>

还有一点需要注意的是:多个trait的使用。

<?php
trait Hello {
public function sayHello() {
echo 'Hello ';
}
}

trait World {
public function sayWorld() {
echo 'World';
}
}

class MyHelloWorld {
use Hello, World;
public function sayExclamationMark() {
echo '!';
}
}

$o = new MyHelloWorld();
$o->sayHello();
$o->sayWorld();
$o->sayExclamationMark();
?>

总结:Trait是一种代码复用技术,为PHP的单继承限制提供了一套灵活的代码复用机制。

附:以上是trait的基本使用,其还有几个比较高级的使用注意点,详细的使用方法可以参见PHP手册,这里给出链接:PHP手册中trait的使用!以上内容中的例子都是来自于该手册。

参考:
1. http://php.net/manual/zh/language.oop5.traits.php
2. http://laravelacademy.org/post/4281.html
3. http://www.jianshu.com/p/47f0cdbe9b2c

原文:https://blog.csdn.net/lemony521/article/details/78322652

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/112422.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Java开发中的Memcache原理及实现

    Java开发中的Memcache原理及实现

    2021年9月4日
    49
  • 500-内部服务器错误_win7无法启动server服务错误1083

    500-内部服务器错误_win7无法启动server服务错误1083我们在操作win10系统电脑的时候,常常会遇到win10系统提示http500内部服务器错误的情况,想必大家都遇到过win10系统提示http500内部服务器错误的情况吧,那么应该怎么处理win10系统提示http500内部服务器错误呢?我们依照在ie浏览器中点击右上角的设置按钮,在弹出的菜单中点击“internet选项”按钮;在internet选项界面切换到【高级】选卡;这样的步骤就行…

    2022年8月12日
    2
  • 转的两种读音区分_category怎么读

    转的两种读音区分_category怎么读类别类别是一种为现有的类添加新方法的方式。利用Objective-C的动态运行时分配机制,可以为现有的类添加新方法,这种为现有的类添加新方法的方式称为类别catagory,他可以为任何类添加新的方法,

    2022年8月4日
    5
  • 会产生classcastexception_服务异常是什么原因

    会产生classcastexception_服务异常是什么原因ClassCastException是JVM在检测到两个类型间转换不兼容时引发的运行时异常。此类错误通常会终止用户请求。在执行任何子系统的应用程序代码时都有可能发生ClassCastException异常。通过转换,可以指示Java编译器将给定类型的变量作为另一种变量来处理。对基础类型和用户定义类型都可以转换。Java语言规范定义了允许的转换,其中大多数可在编译时进行验证。不过,某些转换还需要运行…

    2022年9月10日
    1
  • css left right_leftorright什么意思

    css left right_leftorright什么意思零、说点什么好久没更新了。并不是在折腾什么大作,而是广度学习与实践中,加上婚礼等诸多大事,所以产出较少。今天这篇也只是小作,博客是自己很好的学习工具,只要我学习不止,博客也会不断更新的。我们平时一般都使用clear:both清除浮动,貌似就干这一件事件。用得很开心,但似乎理解上懵懵懂懂,我其实也是,早年的时候,测试过CSS clear:left/right,虽知其作用(

    2022年9月11日
    1
  • MySQL数据查询之单表查询

    单表查询简单查询-创建表DROPTABLEIFEXISTS`person`;CREATETABLE`person`(`id`int(11)NOTNULLAUTO_IN

    2022年3月29日
    47

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号