PHP之Trait详解
php从以前到现在一直都是单继承的语言,无法同时从两个基类中继承属性和方法,为了解决这个问题,php出了Trait这个特性
用法:通过在类中使用use 关键字,声明要组合的Trait名称,具体的Trait的声明使用Trait关键词,Trait不能实例化
如下代码实例:
<?php trait Dog{public $name="dog";public function bark(){echo "This is dog";} } class Animal{public function eat(){echo "This is animal eat";} } class Cat extends Animal{use Dog;public function drive(){echo "This is cat drive";} } $cat = new Cat(); $cat->drive(); echo "<br/>"; $cat->eat(); echo "<br/>"; $cat->bark(); ?>
将会如下输出
This is cat drive This is animal eat This is dog
再测试Trait、基类和本类对同名属性或方法的处理,如下代码
<?php trait Dog{public $name="dog";public function drive(){echo "This is dog drive";}public function eat(){echo "This is dog eat";} }class Animal{public function drive(){echo "This is animal drive";}public function eat(){echo "This is animal eat";} }class Cat extends Animal{use Dog;public function drive(){echo "This is cat drive";} } $cat = new Cat(); $cat->drive(); echo "<br/>"; $cat->eat();
如下显示
This is cat drive This is dog eat
所以:Trait中的方法或属性会覆盖 基类中的同名的方法或属性,而本类会覆盖Trait中同名的属性或方法
一个类可以组合多个Trait,通过逗号相隔,如下
use trait1,trait2
当不同的trait中,却有着同名的方法或属性,会产生冲突,可以使用insteadof或 as进行解决,insteadof 是进行替代,而as是给它取别名
如下实例:
<?php trait trait1{public function eat(){echo "This is trait1 eat";}public function drive(){echo "This is trait1 drive";} } trait trait2{public function eat(){echo "This is trait2 eat";}public function drive(){echo "This is trait2 drive";} } class cat{use trait1,trait2{trait1::eat insteadof trait2;trait1::drive insteadof trait2;} } class dog{use trait1,trait2{trait1::eat insteadof trait2;trait1::drive insteadof trait2;trait2::eat as eaten;trait2::drive as driven;} } $cat = new cat(); $cat->eat(); echo "<br/>"; $cat->drive(); echo "<br/>"; echo "<br/>"; echo "<br/>"; $dog = new dog(); $dog->eat(); echo "<br/>"; $dog->drive(); echo "<br/>"; $dog->eaten(); echo "<br/>"; $dog->driven(); ?>
输出如下
This is trait1 eat This is trait1 driveThis is trait1 eat This is trait1 drive This is trait2 eat This is trait2 driv
as 还可以修改方法的访问控制
<?php trait Animal{public function eat(){echo "This is Animal eat";} }class Dog{use Animal{eat as protected;} } class Cat{use Animal{Animal::eat as private eaten;} } $dog = new Dog(); $dog->eat();//报错,因为已经把eat改成了保护$cat = new Cat(); $cat->eat();//正常运行,不会修改原先的访问控制 $cat->eaten();//报错,已经改成了私有的访问控制 ?
Trait也可以互相组合,还可以使用抽象方法,静态属性,静态方法等,实例如下
<?php trait Cat{public function eat(){echo "This is Cat eat";} }trait Dog{use Cat;public function drive(){echo "This is Dog drive";}abstract public function getName();public function test(){static $num=0;$num++;echo $num;}public static function say(){echo "This is Dog say";} } class animal{use Dog;public function getName(){echo "This is animal name";} }$animal = new animal(); $animal->getName(); echo "<br/>"; $animal->eat(); echo "<br/>"; $animal->drive(); echo "<br/>"; $animal::say(); echo "<br/>"; $animal->test(); echo "<br/>"; $animal->test(); ?
输出如下
This is animal name This is Cat eat This is Dog drive This is Dog say 1 2
以上就是我对trait的总结,如有错误,还望指正
作者:依恋灬
链接:https://www.jianshu.com/p/fc053b2d7fd1
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
转载于:https://www.cnblogs.com/onew/p/11365507.html
PHP之Trait详解相关推荐
- php动态+trait,详解PHP神奇又有用的Trait
php和java,c++一样都是单继承模式.但是像python,是支持多继承(即Mixin模式).那么如何在php中实现多继承模式?这就需要使用trait. trait Arrayabletrait{ ...
- 【转】PHP之Trait详解 以及 trait 冲突的解决 insteadof
PHP之Trait学习!! (转)PHP之Trait详解 (转)trait 冲突的解决 insteadof
- Scala Trait详解
为什么80%的码农都做不了架构师?>>> 除了从父类集成代码外,Scala中的类还允许从一个或者多个traits中导入代码. 对于Java程序员来说理解traits的最好方法就 ...
- php中访问控制_PHP之Trait详解
php从以前到现在一直都是单继承的语言,无法同时从两个基类中继承属性和方法,为了解决这个问题,php出了Trait这个特性 用法:通过在类中使用use 关键字,声明要组合的Trait名称,具体的Tra ...
- Rust:Trait 详解
Rust语言里不同的type(比如 struct, enum等)可以调用的函数主要包括本身实现的方法.此外,Rust也提供了trait来定义不同type所需的"common behavior ...
- Scala Trait 详解(实例)
Trait基础 在Scala中,Trait是一种特殊概念.首先,Trait可以被作为接口来使用,此时Trait与Java的接口非常类似.同时在Trait可以定义抽象方法,其与抽象类中的抽象方法一样,不 ...
- php之新特性trait详解
废话不多说了,直接进入主题吧. 为什么要使用它,使用它有什么好处: 开发人员能够自由地在不同层次结构内独立的类中复用 method,在一定程度上弥补了单继承语言在某些情况下代码不能复用的问题. 与普通 ...
- Rust 12: 面向对象详解(struct + impl + trait)
文章目录 struct impl trait 扩展阅读 总结 struct关键字用于定义一个数据结构,可以类比为面向对象语言中的class. impl关键字可以为struct实现关联的成员方法. tr ...
- Scala进阶之路-面向对象编程之类的成员详解
Scala进阶之路-面向对象编程之类的成员详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Scala中的object对象及apply方法 1>.scala 单例对象 ...
- mysql 魔术设置_详解php魔术方法(Magic methods)的使用方法
PHP中把以两个下划线__开头的方法称为魔术方法,这些方法在PHP中充当了举足轻重的作用. 魔术方法包括: __construct(),类的构造函数 __destruct(),类的析构函数 __cal ...
最新文章
- Caffe源码中layer文件分析
- CPU制作流程大揭密
- springMVC保存数据到mysql数据库中文乱码问题解决方法
- CDH5离线安装手册
- 道路交通实时流量监控预测系统(大讲台)
- 职场思想分享001 | 有多种选择才叫有能力
- 紧跟月影大佬的步伐,一起来学习如何写好JS(上)
- Pi network到底怎么样?我们来深入剖析一下
- 两条边延长角会有什么变化_叶片锁是什么样的 叶片锁使用方法【详解】
- 华为nova 5 Pro现身GeekBench数据库:妥妥麒麟980水准
- 怎么用php myadmin连接远程MYSQL数据库
- Undefined symbols for architecture i386:问题解决
- [BZOJ4756]Promotion Counting
- 三、系统分层和分割策略
- 天气暖和了,我却感冒了
- java基础 CAS算法的简单理解
- n1装linux系统升级,N1 降级刷机救砖总结
- mysql根据15位或者18位身份证号计算年龄的自定义函数
- 日常生活中的企业监控
- 使用GoLang开发游戏服务器(一)
热门文章
- 温故知新----css布局
- 台式电脑显示器黑屏但灯亮_显示器黑屏无信号 但电脑一直在运行的原因和解决办法...
- python elasticsearch dsl_python 查询 elasticsearch 常用方法(Query DSL)
- 安装高版本的java_运行“需要Java 11或更高版本”的Visual Studio代码。请下载并安装最新的JDK”...
- matlab怎么调出来的,如何调出MATLAB内部函数的源程序?
- pat A1052:Linked List Sorting静态链表+链表排序
- python机器学习搭建空气质量AQI(air quality index)预测模型
- MLOps- 吴恩达Andrew Ng Overview of the ML Lifecycle and Deployment Week1 论文等资料汇总
- 解决XCode运行app在模拟器上,提示模拟器不存在
- Swift 5 闭包Closure简明教程