关于trait()
程序员文章站
2022-05-29 13:17:54
自 起, 实现了一种代码复用的方法,称为 。 是为类似 的单继承语言而准备的一种代码复用机制。 为了减少单继承语言的限制,使开发人员能够*地在不同层次结构内独立的类中复用 。 _ 看上去更像是为了代码的复用而写的一个小插件,它类似于 可以用 放在类中间,让 里面定义的方法作为 的一部分 本身不能直 ......
自 php 5.4.0
起,php
实现了一种代码复用的方法,称为 trait
。
trait
是为类似 php
的单继承语言而准备的一种代码复用机制。trait
为了减少单继承语言的限制,使开发人员能够*地在不同层次结构内独立的类中复用 method
。
trait
看上去更像是为了代码的复用而写的一个小插件,它类似于include
可以用use
放在类中间,让trait
里面定义的方法作为class
的一部分 本身不能直接实例化,trai
t的作用域在引用该trai
t类的内部是都可见的(public
、private
等等都可以) 可以理解为use
关键字将trait
的实现代码copy
了一份到引用该trait
的类中 。
<?php trait ezcreflectionreturninfo { function getreturntype() { /*1*/ } function getreturndescription() { /*2*/ } } class ezcreflectionmethod extends reflectionmethod { use ezcreflectionreturninfo; /* ... */ } class ezcreflectionfunction extends reflectionfunction { use ezcreflectionreturninfo; /* ... */ } ?>
优先级
从基类继承的成员会被 trait
插入的成员所覆盖。优先顺序是来自当前类的成员覆盖了 trait
的方法,而 trait
则覆盖了被继承的方法。
<?php class base { public function sayhello() { echo 'hello '; } } trait sayworld { public function sayhello() { parent::sayhello(); echo 'world!'; } } class myhelloworld extends base { use sayworld; } $o = new myhelloworld(); $o->sayhello(); #输出:hello, world! ?>
<?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
通过逗号分隔,在 use
声明列出多个 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
都插入了一个同名的方法,如果没有明确解决冲突将会产生一个致命错误。
引用地址:
推荐阅读
-
输入框的字数时时统计—关于 onpropertychange 和 oninput 使用
-
关于Python作用域自学总结
-
关于Android短信验证码的获取的示例
-
Android关于WebView中无法定位的问题解决
-
关于HashMap与某面试官的探讨
-
浅谈关于C#的垃圾回收机制
-
Python面向对象编程中关于类和方法的学习笔记
-
sqlserver关于分页存储过程的优化【让数据库按我们的意思执行查询计划】
-
详解关于IntelliJ IDEA中Schedule for Addition 的问题
-
windows下关于sublime text2,HTML/CSS/JS Prettify插件使用路径问题处理