真正的短版本更简单,因为你不能。这不是Traits如何工作。

当你写使用SomeTrait;在PHP中,你(有效地)告诉编译器将Trait中的代码复制并粘贴到正在使用的类中。

因为使用SomeTrait;是在类中,它不能添加实现SomeInterface到类,因为那必须在类外面。

“why aren’t Traits types in PHP? “

因为它们不能被实例化。 Traits实际上只是一个language construct(告诉编译器将trait代码复制并粘贴到这个类中),而不是可以被代码引用的对象或类型。

So, i want to “design” in the code that every class that want to use

my trait have to implement the interface.

这可以通过使用抽象类来实现,以使用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(){

//Trying to instantiate this class without this function uncommented will throw an error

//Fatal error: Class TestClass contains 1 abstract method and must therefore be

//declared abstract or implement the remaining methods (SomeInterface::doSomething)

//}

}

$test = new TestClass();

$test->sayHello();

然而 – 如果你确实需要强制使用特性的任何类有一个特定的方法,我认为你可能使用你应该是抽象类的traits。

或者你有你的逻辑错误的方式。你的意思是要求实现接口的类具有某些功能,而不是如果他们有某些必须声明为实现接口的函数。

编辑

实际上,您可以在Traits中定义抽象函数,以强制类实现该方法。例如

trait LoggerTrait {

public function debug($message, array $context = array()) {

$this->log('debug', $message, $context);

}

abstract public function log($level, $message, array $context = array());

}

然而,这仍然不允许你在trait中实现接口,并且仍然闻到一个糟糕的设计,因为接口比定义一个类需要满足的契约要好得多。

php trait编译实现,为什么PHP Trait不能实现接口?相关推荐

  1. trait功能 php,PHP之Trait功能与用法实例分析

    本文实例讲述了PHP Trait功能与用法.分享给大家供大家参考,具体如下: Trait 是为类似 PHP 的单继承语言而准备的一种代码复用机制. 1.如果引入的Trait有同名的方法trait A{ ...

  2. trait php中,php中trait的使用

    1.trait是什么? Trait可以看做类的部分实现,可以混入一个或多个现有的PHP类中,其作用有两个:表明类可以做什么:提供模块化实现.Trait是一种代码复用技术,为PHP的单继承限制提供了一套 ...

  3. ubuntu14.04下安装cudnn5.1.3,opencv3.0,编译caffe及配置matlab和python接口过程记录

    已有条件: ubuntu14.04+cuda7.5+anaconda2(即python2.7)+matlabR2014a 上述已经装好了,开始搭建caffe环境. 1. 装cudnn5.1.3,参照: ...

  4. avro的c语言api,在CentOS/RHEL上编译序列化软件Avro的C语言接口库

    消息由键,值和头部组成.Kafka不识别消息中键和值,它按字节数组处理他们.但生产者和消费者关心如何读取这些数据.所以我们希望数据存储的方式是易读的,同时它还要尽可能地紧凑和快速编解码.例如,JSON ...

  5. Spark基础-scala学习(三、Trait)

    面向对象编程之Trait trait基础知识 将trait作为接口使用 在trait中定义具体方法 在trait中定义具体字段 在trait中定义抽象字段 trait高级知识 为实例对象混入trait ...

  6. scala学习笔记-面向对象编程之Trait

    将trait作为接口使用 1 // Scala中的Triat是一种特殊的概念2 // 首先我们可以将Trait作为接口来使用,此时的Triat就与Java中的接口非常类似3 // 在triat中可以定 ...

  7. Scala学习教程笔记二之函数式编程、Object对象、伴生对象、继承、Trait、

    1:Scala之函数式编程学习笔记: 1:Scala函数式编程学习:1.1:Scala定义一个简单的类,包含field以及方法,创建类的对象,并且调用其方法:class User {private v ...

  8. corutine rust_Rust学习笔记#5:函数和trait

    函数 基本语法 Rust的函数使用fn关键字开头,函数可以有一系列的输入参数,还有一个返回类型.函数返回可以使用return语句,可以使用表达式.下面是一个标准函数的示例,add函数接受两个i32的参 ...

  9. 28.特性trait.rs

    /* 特性(trait)概念接近于 Java 中的接口(Interface),但两者不完全相同.特性与接口相同的地方在于它们都是一种行为规范,可以用于标识哪些类有哪些方法 trait Descript ...

最新文章

  1. 调试模式和定时器,看门狗和嘀嗒定时器
  2. 笔记:面试 - Vue
  3. gcc优化的简单说明
  4. Vue提供操作DOM的方法
  5. Vlan和vtp重要的配置命令
  6. JAVA入门级教学之(内存中的空指针异常)
  7. (24)打两拍verilog与VHDL编码(学无止境)
  8. python如何爬虫eps数据_Python爬虫常用的几种数据保存方式
  9. 深度理解linux内核零拷贝,面试题:如何理解 Linux 的零拷贝技术?
  10. C# winFrom 自定义gridview样式制作好看的大屏显示队列
  11. Excel单元格引用方式
  12. snapchat_如何截屏和共享Snapchat快照
  13. nas服务器用户无访问权限,群晖NAS文件权限管理和账户的权限
  14. wamp5环境配置基础教程
  15. 机械螺旋缠绕法管道非开挖修复
  16. testbench——文件读入输出
  17. Apache Arrow 简介
  18. python 图像清晰度_图像清晰度评价指标(Python)
  19. JDK1.7ConcurrentHashMap源码分析
  20. [Presto]presto REST API

热门文章

  1. DICOM查询/获取信息模型的研究及关系数据库实现
  2. 弃用数据库自增ID,曝光一下我自己用到的解决方法之---终结篇
  3. 给图片添加水印效果图的函数(可以在图片上添加自己的版权和LOGO图片的水印) 【转载】...
  4. 好东西真多,如何让自己学的能跟上技术的发展呢
  5. DELL服务器常见报错信息
  6. Linux 命令汇总!【珍藏版】
  7. Linux ftp 上传文件 提示 Permission denied 解决办法
  8. 记一次MySQL中Waiting for table metadata lock的解决方法
  9. Python2.7-异常和工具
  10. ubuntu终端执行shell脚本报command not found解决方法