<?php
/** 自 PHP 5.4.0 起,PHP 实现了一种代码复用的方法,称为 trait。* Trait 是为类似 PHP 的单继承语言而准备的一种代码复用机制。* Trait 为了减少单继承语言的限制,使开发人员能够自由地在不同层次结构内独立的类中复用 method。* Trait 和 Class 组合的语义定义了一种减少复杂性的方式,避免传统多继承和 Mixin 类相关典型问题。Trait 和 Class 相似,但仅仅旨在用细粒度和一致的方式来组合功能。
无法通过 trait 自身来实例化。它为传统继承增加了水平特性的组合;
也就是说,应用的几个 Class 之间不需要继承。从基类继承的成员会被 trait 插入的成员所覆盖。优先顺序是来自当前类的成员覆盖了 trait 的方法,而 trait 则覆盖了被继承的方法。* */
/*trait getinfo
{function gettype(){return "我是Trait中定义的gettype方法";}function getname(){return "我是Trait中定义的getname方法";}
}
class aa{use getinfo;public function gettype(){return "我是类aa中定义的gettype方法";}public function getname(){return "我是类aa中定义的getname方法";}
}
$aa=new aa();
echo $aa->gettype();//我是类aa中定义的方法
class bb extends aa{
}
$bb=new bb();
echo $bb->getname();//输出:我是类aa中定义的getname方法*//*多个 trait ¶*通过逗号分隔,在 use 声明列出多个 trait,可以都插入到一个类中。* *//*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();//输出:Hello World!*//*冲突的解决
如果两个 trait 都插入了一个同名的方法,如果没有明确解决冲突将会产生一个致命错误。为了解决多个 trait 在同一个类中的命名冲突,需要使用 insteadof 操作符来明确指定使用冲突方法中的哪一个。以上方式仅允许排除掉其它方法,as 操作符可以 为某个方法引入别名。 注意,as 操作符不会对方法进行重命名,也不会影响其方法。* */
/*trait A {public function smallTalk() {echo 'a';}public function bigTalk() {echo 'A';}
}trait B {public function smallTalk() {echo 'b';}public function bigTalk() {echo 'B';}
}class Talker {use A, B {B::smallTalk insteadof A;A::bigTalk insteadof B;}
}class Aliased_Talker {use A, B {B::smallTalk insteadof A;A::bigTalk insteadof B;B::bigTalk as talk;}
}*//*修改方法的访问控制 ¶* 使用 as 语法还可以用来调整方法的访问控制** *//*trait HelloWorld
{public function sayHello(){echo 'Hello World!';}
}// 修改 sayHello 的访问控制
class MyClass1
{use HelloWorld {sayHello as protected;}
}// 给方法一个改变了访问控制的别名
// 原版 sayHello 的访问控制则没有发生变化
class MyClass2
{use HelloWorld {sayHello as private myPrivateHello;}public function __construct(){$this->myPrivateHello();//输出:Hello World!}
}
$myclass2 = new MyClass2();*//*从 trait 来组成 trait ¶* 正如 class 能够使用 trait 一样,其它 trait 也能够使用 trait。* 在 trait 定义时通过使用一个或多个 trait,能够组合其它 trait 中的部分或全部成员。* */
//Example #7 从 trait 来组成 trait
/*trait Hello {public function sayHello() {echo 'Hello ';}
}trait World {public function sayWorld() {echo 'World!';}
}trait HelloWorld {use Hello, World;
}class MyHelloWorld {use HelloWorld;
}
$MyHelloWorld=new MyHelloWorld();
$MyHelloWorld->sayHello();
$MyHelloWorld->sayWorld();*/
?>

 原文地址:http://php.net/manual/zh/language.oop5.traits.php#language.oop5.traits.multiple

转载于:https://www.cnblogs.com/yiweiyihang/p/8530948.html

PHP中的Trait方法相关推荐

  1. php调用trait方法,PHP Laravel中的Trait使用方法

    Trait是一种在单继承语言(如PHP)中重用代码的机制.Trait旨在通过使开发人员能够在生活在不同类层次结构中的多个独立类中自由地重用方法集来减少单继承的某些限制.Traits和类组合的语义以降低 ...

  2. scala学习手记34 - trait方法的延迟绑定

    trait的方法的延迟绑定就是先混入的trait的方法会后调用.这一点从上一节的实例中也可以看出来. 下面再来看一个类似的例子: abstract class Writer {def write(me ...

  3. Scala中的trait特质

    Trait字面意思就是特质或者特征,这个词翻译成特征比较合适.它的意义和Java,c#中的接口很类似.但是trait支持部分实现,也就是说可以在scala的trait中实现部分方法. 在下面的例子中定 ...

  4. scala 基础十一 scala 中的trait特质

    1.Scala类型系统的基础部分是与Java非常相像的.Scala与Java一样有单一的根类,Java通过接口来实现多重继承,而Scala则通过特征(trait)来实现(Scala的特征可以包含实现代 ...

  5. kotlin 扩展函数_在 Kotlin 中“实现”trait/类型类

    本文原发于我的个人博客:https://hltj.me/kotlin/2020/01/11/kotlin-trait-typeclass.html.本副本只用于知乎,禁止第三方转载. trait 与类 ...

  6. 谈谈PHP中的trait

    谈谈PHP中的trait 前言 目的 应用场景 简单使用 1. 基础代码 2. 调用其中一个trait中的方法 3. 在自己的方法中定义一个和trait中同名的方法 4. 若是我们在类中同时引用两个 ...

  7. vue打印props的值_vue中props传值方法

    vue中props传值方法 1.开发环境 vue 2.电脑系统 windows10专业版 3.在使用 vue开发的过程中,我们经常会使用 props进行组件的传值,下面是我的分享,希望对你有所帮助! ...

  8. Javascript中二进制数据处理方法

    Javascript中二进制数据处理方法 转载于:https://www.cnblogs.com/motadou/archive/2012/02/19/2358514.html

  9. HashSet中的add()方法( 五 )(详尽版)

    上接 HashSet中的add()方法( 四 )(详尽版) ,我们再重写一下equals()方法来看看是否可以不能存入相同的id: 在学生类中再重写equals()方法: public class S ...

最新文章

  1. html中for标记,C#使用for循环移除HTML标记
  2. this.class.getClassLoader().getResourceAsStream与this.class.getResourceAsStream
  3. android studio 单步调试jni,android studio实现Jni单步调试-标准配置教程
  4. mysql构建镜像时写入密码_用Dockerfile手动创建mysql5.7主从镜像
  5. matlab 离散点差值,散点图的插值方法
  6. MFC文档、视图类的基本功能和二者基本关系
  7. [Android]Volley源代码分析(店)应用
  8. 利用Java实现串口全双工通讯
  9. C#读取Excel表格数据到DataGridView中和导出DataGridView中的数据到Excel
  10. 【火炉炼AI】机器学习018-项目案例:根据大楼进出人数预测是否举办活动
  11. 小屏旗舰新王者: 三星Galaxy S11e曝光
  12. 什么是PV UV PR值
  13. php十六进制字符串转成字节数组_PHP中的数据类型及实例演示
  14. 在odoo服务器文件夹,在windows10上安装odoo12开发环境的方法
  15. 【机器学习系列】MCMC第二讲:Markov Chain Monte Carlo基本概念和核心思想
  16. 小车故障灯亮显示大全_原创案例丨17款迈锐宝XL缺缸故障
  17. 有哪些高质量的图片网站(社区)推荐?
  18. 如何卸载--奇安信安全终端管理系统
  19. 历史上的9月 | Mix时光机
  20. JAVA_Android客户端_基础知识点总结

热门文章

  1. bai的字怎么写_硬笔书法的连笔字应该要怎么写?
  2. typescript使用in关键字进行类型守卫
  3. java解析静态AIS原始数据
  4. php 科研,科研之路2
  5. tomcat启动分析(2)
  6. java web开发问题集合
  7. iptables--静态防火墙实例教程
  8. Setting Meta Tags
  9. CCNP中单区域OSPF详解(第一部分)
  10. 利用datagrip从hive导入csv数据(还没整理完)