我的编程空间,编程开发者的网络收藏夹
学习永远不晚

PHP中Trait的用法介绍

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

PHP中Trait的用法介绍

本篇内容介绍了“PHP中Trait的用法介绍”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

1. 继承 VS 多态 VS Trait

现在有Publish.phpAnswer.php这两个类。要在其中添加LOG功能,记录类内部的动作。有以下几种方案:

  • 继承

  • 多态

  • Trait

1.1. 继承

如图:

PHP中Trait的用法介绍

代码结构如下:

// Log.php<?phpClass Log {public function startLog()     {// echo ...}public function endLog()     {// echo ...}}
// Publish.php<?phpClass Publish extends Log {}
// Answer.php<?phpClass Answer extends Log {}

可以看到继承的确满足了要求。但这却违背了面向对象的原则。而发布(Publish)和回答(Answer)这样的操作和日志(Log)之间的关系并不是子类与父类的关系。所以不推荐这样使用。

1.2. 多态

如图:

PHP中Trait的用法介绍

实现代码:

// Log.php<?phpInterface Log {public function startLog();public function endLog();}
// Publish.php<?phpClass Publish implements Log {public function startLog()     {// TODO: Implement startLog() method.}public function endLog()     {// TODO: Implement endLog() method.}}
// Answer.php<?phpClass Answer implements Log {public function startLog()     {// TODO: Implement startLog() method.}public function endLog()     {// TODO: Implement endLog() method.}}

记录日志的操作应该都是一样的,因此,发布(Publish)和回答(Answer)动作中的日志记录实现也是一样的。很明显,这违背了DRY(Don&rsquo;t Repeat Yourself)原则。所以是不推荐这样实现的。

1.3. Trait

如图:

PHP中Trait的用法介绍

实现代码如下:

// Log.php<?phptrait Log{public function startLog() {// echo ..}public function endLog() {// echo ..}}
// Publish.php<?phpclass Publish {use Log;}$publish = new Publish();$publish->startLog();$publish->endLog();
// Answer.php<?phpclass Answer {use Log;}$answer = new Answer();$answer->startLog();$answer->endLog();

可以看到,我们在没有增加代码复杂的情况下,实现了代码的复用。

1.4. 结论

继承的方式虽然也能解决问题,但其思路违背了面向对象的原则,显得很粗暴;多态方式也可行,但不符合软件开发中的DRY原则,增加了维护成本。而Trait方式则避免了上述的不足之处,相对优雅的实现了代码的复用。

2. Trait的作用域

了解了Trait的好处,我们还需要了解其实现中的规则,先来说一下作用域。这个比较好证明,实现代码如下:

<?phpclass Publish {use Log;public function doPublish() {$this->publicF();$this->protectF();$this->privateF();    }}$publish  = new Publish();$publish->doPublish();

执行上述代码输出结果如下:

public functionprotected functionprivate function

可以发现,Trait的作用域在引用该Trait类的内部是都可见的。可以理解为use关键字将Trait的实现代码Copy了一份到引用该Trait的类中。

3. Trait中属性的优先级

说到优先级,就必须要有一个对比的参照物,这里的参照对象时引用Trait的类及其父类。

通过以下的代码来证明Trait应用中的属性的优先级:

<?phptrait Log{public function publicF()     {echo __METHOD__ . ' public function' . PHP_EOL;    }protected function protectF()     {echo __METHOD__ . ' protected function' . PHP_EOL;    }}class Question {public function publicF()     {echo __METHOD__ . ' public function' . PHP_EOL;    }protected function protectF()     {echo __METHOD__ . ' protected function' . PHP_EOL;    }}class Publish extends Question {use Log;public function publicF()     {echo __METHOD__ . ' public function' . PHP_EOL;    }public function doPublish()     {$this->publicF();$this->protectF();    }}$publish = new Publish();$publish->doPublish();

上述代码的输出结果如下:

Publish::publicF public functionLog::protectF protected function

通过上面的例子,可以总结出Trait应用中的优先级如下:

  1. 来自当前类的成员覆盖了 trait 的方法

  2. trait 覆盖了被继承的方法

类成员优先级为:当前类>Trait>父类

4. Insteadof和As关键字

在一个类中,可以引用多个Trait,如下:

<?phptrait Log{public function startLog()     {echo __METHOD__ . ' public function' . PHP_EOL;    }protected function endLog()     {echo __METHOD__ . ' protected function' . PHP_EOL;    }}trait Check{public function parameterCheck($parameters) {// do sth}}class Publish extends Question {use Log,Check;public function doPublish($para) {$this->startLog();$this->parameterCheck($para);$this->endLog();    }}

通过上面的方式,我们可以在一个类中引用多个Trait。引用多个Trait的时候,就容易出问题了,最常见的问题就是两个Trait中如果出现了同名的属性或者方法该怎么办呢?这个时候就需要用到Insteadof 和 as 这两个关键字了.请看如下实现代码:

<?phptrait Log{public function parameterCheck($parameters)     {echo __METHOD__ . ' parameter check' . $parameters . PHP_EOL;    }public function startLog()     {echo __METHOD__ . ' public function' . PHP_EOL;    }}trait Check{public function parameterCheck($parameters)     {echo __METHOD__ . ' parameter check' . $parameters . PHP_EOL;    }public function startLog()     {echo __METHOD__ . ' public function' . PHP_EOL;    }}class Publish {use Check, Log {Check::parameterCheck insteadof Log;        Log::startLog insteadof Check;        Check::startLog as csl;    }public function doPublish()     {$this->startLog();$this->parameterCheck('params');$this->csl();    }}$publish = new Publish();$publish->doPublish();

执行上述代码,输出结果如下:

Log::startLog public functionCheck::parameterCheck parameter checkparamsCheck::startLog public function

就如字面意思一般,insteadof关键字用前者取代了后者,as 关键字给被取代的方法起了一个别名。

在引用Trait时,使用了use关键字,use关键字也用来引用命名空间。两者的区别在于,引用Trait时是在class内部使用的。

“PHP中Trait的用法介绍”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

PHP中Trait的用法介绍

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

PHP中Trait的用法介绍

本篇内容介绍了“PHP中Trait的用法介绍”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1. 继承 VS 多态 VS Trait现在有Pu
2023-06-17

php中trait的使用方法

这篇文章主要介绍了php中trait的使用方法,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。php trait是一种代码复用技术,为PHP的单继承限制提供了一套灵活的代码复用
2023-06-15

php中珠算法的介绍

这篇文章主要介绍“php中珠算法的介绍”,在日常操作中,相信很多人在php中珠算法的介绍问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”php中珠算法的介绍”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!说明
2023-06-20

PHP中trait的基础语法

小编给大家分享一下PHP中trait的基础语法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧! 类中的某些成员如何才能被其他类使用呢?使用继承的话,这继承链也太长了
2023-06-06

php引用类名的方法介绍

这篇文章主要讲解了“php引用类名的方法介绍”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“php引用类名的方法介绍”吧!PHP 命名空间中的类名可以通过三种方式引用:1、非限定名称,或不包含
2023-06-20

Oracle中RAC的用法介绍

Oracle中RAC的用法:1、通过在多个服务器上运行数据库实例来提供高可用性;2、允许在需要时增加或减少节点数量;3、通过将工作负载分布到多个节点上来实现负载均衡;4、使用共享存储来实现多个节点之间的数据共享;5、允许多个节点同时处理数据
2023-10-22

trait怎么在php中使用

本篇文章给大家分享的是有关trait怎么在php中使用,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。php是什么语言php,一个嵌套的缩写名称,是英文超级文本预处理语言(PHP
2023-06-14

JavaScript中setAttribute用法介绍

JavaScript中的setAttribute()方法用于设置指定元素的属性值。语法:element.setAttribute(attributeName, attributeValue)参数说明:- attributeName:要设置的
2023-08-09

iOS中NSNumberFormatter的介绍与用法

前言 iOS中NSDateFormatter用的范围一般来说比较广泛,不过相对于处理数字而言,很少用到NSNumberFormatter,NSNumberFormatter中有很多枚举类型,会为实际开发节省时间. NSNumberForma
2022-05-31

PHP基本语法介绍

这篇文章主要介绍“PHP基本语法介绍”,在日常操作中,相信很多人在PHP基本语法介绍问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”PHP基本语法介绍”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!在进行PH
2023-06-17

详细介绍PHP中时间处理类Carbon的用法

本篇文章主要给大家介绍了关于PHP的相关知识,Carbon 是php的日期处理类库(A simple PHP API extension for DateTime.),继承了PHP的 Datetime 类,下面讲解一下该类的使用,希望对大家有帮助。(推荐教程:PHP视频教程)1.IntroductionCarbon 是php的日期处理类库(A simple PHP API extension for
2022-08-08

怎么使用PHP中的trait能力

这篇文章将为大家详细讲解有关怎么使用PHP中的trait能力,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。trait能力在PHP中的使用相信大家对trait已经不陌生了,早在5.4时,trait就已经出现
2023-06-15

CentOS系统中RPM的用法介绍

这篇文章主要介绍“CentOS系统中RPM的用法介绍”,在日常操作中,相信很多人在CentOS系统中RPM的用法介绍问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”CentOS系统中RPM的用法介绍”的疑惑有所
2023-06-10

Python中os模块的用法介绍

今天小编给大家分享的是Python中os模块的用法介绍,相信很多人都不太了解,为了让大家更加了解,所以给大家总结了以下内容,一起往下看吧。一定会有所收获的哦。1、说明os.path.exists():用于判断某个路径(文件或文件夹)是否存在
2023-06-15

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录