博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
为什么php的trait不能实现interface
阅读量:6690 次
发布时间:2019-06-25

本文共 1125 字,大约阅读时间需要 3 分钟。

  hot3.png

php中为什么trait不能实现interface? 有时候,我们可能会需求使用我们的trait T的所有class都必须实现某interface I,毕竟在每个class中implement I 总没有使用 trait T implements I {} 方便。

具体代码

要弄明白这个问题,首先要理解interface和trait都是什么。

interface是class的一个约束条件,指定某个class必须实现哪些方法,但不需要定义这些方法的具体内容。

trait出现的比interface要晚,官方定义是:

简单来说:Trait是部分class的实现,让我们能将部分class注入到其他class。

trait有两个功能 :

  1. 提供如interface的。
  2. 提供如class的实现。

所以trait是一个看起来像interface,但用起来像class的东西。

我们来看一下,php是如何实现trait的。

在php中当使用Trait时,只是告诉编译器将Trait中的代码复制并粘贴到正在使用的类中,因为interface必须在类外面,所以就不能在trait中实现有关interface的代码了。

Traits实际上只是一个语言结构(告诉编译器将trait代码复制并粘贴到此类中),而不是可以由代码引用的对象或类型,所以trait也不能被实例化。

综上,如果想在代码中每个类使用我的trait都必须实现相应的接口,确实不怎么简单。

不过还可以通过使用抽象类来实现,以使用trait然后从它扩展类。

具体参考代码

interface SomeInterface{    public function someInterfaceFunction();}trait SomeTrait {    function sayHello(){        echo "Hello my secret is ".static::$secret;    }}abstract class AbstractClass implements SomeInterface{    use SomeTrait;}class TestClass extends AbstractClass {    static public  $secret = 12345;    function someInterfaceFunction(){        # some code    }}$test = new TestClass();$test->sayHello();

转载于:https://my.oschina.net/zho/blog/839641

你可能感兴趣的文章
实体 map 属性
查看>>
php设计模式--适配器模式
查看>>
java中的枚举类 enum使用与分析
查看>>
JAVA 四大域对象总结
查看>>
GIT 常用命令
查看>>
企业级落地容器与DevOps,选用K8S都有哪些“姿势”
查看>>
Android平台播放语音时支持听筒、喇叭之间切换
查看>>
RPC的实现
查看>>
不一样的Office 365之 —— 使用StaffHub管理你的排班
查看>>
从Mysql EXPLAIN探寻数据库查询优化2
查看>>
让元素居中
查看>>
php memcache保存session的一个设置误区
查看>>
鱼眼镜头
查看>>
Scalatra
查看>>
CentOS 7 三者分离编译安装LAMP
查看>>
Linux内核调整,支持4000-8000并发
查看>>
jquery mobile 设置设备适配
查看>>
redis使用总结-redis命令总结
查看>>
创业浪潮:春天蓬勃而来
查看>>
阿里云Linux安装软件镜像源
查看>>