返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >PHP中Trait的用法介绍
  • 852
分享到

PHP中Trait的用法介绍

2023-06-17 04:06:21 852人浏览 八月长安
摘要

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

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

--结束END--

本文标题: PHP中Trait的用法介绍

本文链接: https://lsjlt.com/news/287120.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • PHP中Trait的用法介绍
    本篇内容介绍了“PHP中Trait的用法介绍”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1. 继承 VS 多态 VS Trait现在有Pu...
    99+
    2023-06-17
  • php中trait的使用方法
    这篇文章主要介绍了php中trait的使用方法,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。php trait是一种代码复用技术,为PHP的单继承限制提供了一套灵活的代码复用...
    99+
    2023-06-15
  • php中珠算法的介绍
    这篇文章主要介绍“php中珠算法的介绍”,在日常操作中,相信很多人在php中珠算法的介绍问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”php中珠算法的介绍”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!说明...
    99+
    2023-06-20
  • PHP trait的使用方法
    trait、继承和实例化的区别: 对于当前一个类需要用到另一个或多个类的方法的情况,我们一般会想到的方式有继承、直接实例化另外一个或多个类等等的方法,下面来对比一下这些方法和Trait类的区别: 1、继承方式:对于继承,可以完美地复用另一...
    99+
    2023-09-02
    php 开发语言
  • PHP中trait的基础语法
    小编给大家分享一下PHP中trait的基础语法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧! 类中的某些成员如何才能被其他类使用呢?使用继承的话,这继承...
    99+
    2023-06-06
  • php引用类名的方法介绍
    这篇文章主要讲解了“php引用类名的方法介绍”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“php引用类名的方法介绍”吧!PHP 命名空间中的类名可以通过三种方式引用:1、非限定名称,或不包含...
    99+
    2023-06-20
  • js中promise的用法介绍
    这篇文章主要介绍“js中promise的用法介绍”,在日常操作中,相信很多人在js中promise的用法介绍问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”js中promise...
    99+
    2024-04-02
  • Oracle中RAC的用法介绍
    Oracle中RAC的用法:1、通过在多个服务器上运行数据库实例来提供高可用性;2、允许在需要时增加或减少节点数量;3、通过将工作负载分布到多个节点上来实现负载均衡;4、使用共享存储来实现多个节点之间的数据共享;5、允许多个节点同时处理数据...
    99+
    2023-10-22
    oracle rac oracle
  • 介绍Golang中interface的用法
    Go 是一个强类型编程语言,与其他编程语言不同的是,它具有一个接口(interface)类型,它允许定义一个或多个方法的签名,但没有实现。通过实现该接口的方法,可以将具有不同数据类型的不同类型的对象赋值给相同的接口类型并进行处理,使编程变得...
    99+
    2023-05-14
  • CSS中的@import的用法介绍
    本篇内容主要讲解“CSS中的@import的用法介绍”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“CSS中的@import的用法介绍”吧!我们知道,css文件引...
    99+
    2024-04-02
  • Vue中props用法介绍
    ​前言: 在Vue中通过props,可以将原本孤立的组件串联起来,也就是可以子组件可以接收父组件传递过来的data,比如子组件想要引用父组件的数据,那么在props里面声明一个变量...
    99+
    2024-04-02
  • JavaScript中setAttribute用法介绍
    JavaScript中的setAttribute()方法用于设置指定元素的属性值。语法:element.setAttribute(attributeName, attributeValue)参数说明:- attributeName:要设...
    99+
    2023-08-09
    javascript
  • trait怎么在php中使用
    本篇文章给大家分享的是有关trait怎么在php中使用,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。php是什么语言php,一个嵌套的缩写名称,是英文超级文本预处理语言(PHP...
    99+
    2023-06-14
  • iOS中NSNumberFormatter的介绍与用法
    前言 iOS中NSDateFormatter用的范围一般来说比较广泛,不过相对于处理数字而言,很少用到NSNumberFormatter,NSNumberFormatter中有很多枚...
    99+
    2022-05-31
    nsnumberformatter nsstring nsnumber
  • JavaScript中的遍历用法介绍
    本篇内容介绍了“JavaScript中的遍历用法介绍”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!对象遍历...
    99+
    2024-04-02
  • PHP基本语法介绍
    这篇文章主要介绍“PHP基本语法介绍”,在日常操作中,相信很多人在PHP基本语法介绍问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”PHP基本语法介绍”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!在进行PH...
    99+
    2023-06-17
  • 怎么使用PHP中的trait能力
    这篇文章将为大家详细讲解有关怎么使用PHP中的trait能力,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。trait能力在PHP中的使用相信大家对trait已经不陌生了,早在5.4时,trait就已经出现...
    99+
    2023-06-15
  • 详细介绍PHP中时间处理类Carbon的用法
    本篇文章主要给大家介绍了关于PHP的相关知识,Carbon 是php的日期处理类库(A simple PHP API extension for DateTime.),继承了PHP的 Datetime 类,下面讲解一下该类的使用,希望对大家...
    99+
    2022-08-08
    php
  • PHP中trait的使用和同时引入多个trait时同名方法冲突的处理方法
    目录一、trait的使用二、当父类、子类和trait的方法重名三、类内同时引入多个trait四、引入多个trait有同名方法五、当引入多个trait,同名方法解冲突后,同时使用所有冲...
    99+
    2023-05-18
    PHP中trait的使用 PHP多个trait冲突
  • jwt介绍和PHP的使用
    适用于分布式单点登录(SSO) 流程 客户端输入账号密码登录; 服务端判断登录信息,用户登录成功返回客户端token; 客户端存储token,每个请求都需要传递token到服务端; 服务端验证token的有效期,返回对应的信息; 构成 分为...
    99+
    2023-10-20
    1024程序员节 php
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作