真正的短版本更简单,因为你不能。这不是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. conda创建虚拟环境 和 用conda创建GPU的cuda、cudnn使用环境
  2. Linux下备份cisco路由配置
  3. Android官方开发文档Training系列课程中文版:使用Fragment构建动态UI之构建灵活的UI
  4. tomcat 设置java_为tomcat配置java环境变量
  5. 生产者消费者_Kafka之生产者/消费者
  6. pandas pivot 计算占比_pandas使用9:如何处理时间序列数据
  7. linux查看系统版本_Windows电脑如何查看电脑系统位数及版本号
  8. wcf、web api、webservicer 之间的区别
  9. Luogu1306 斐波那契公约数
  10. 分享如何搭建手机工作室网络
  11. git reset 3种方式
  12. 外行朋友值得一读的5本经典数学书
  13. 在github上下载的.md文件怎么打开
  14. BDB(ICCV2019)
  15. 【计算机网络】 IP地址划分
  16. HTML字母导航栏怎么做,html导航栏下拉菜单怎么制作?这里有详细的代码实例
  17. SAP-ABAP学习-20230307
  18. web前端开发经验总结
  19. CSS之邂逅 (一):认识CSS、编写CSS样式、CSS注释、常见的CSS属性
  20. rz: xxxxxxx removed

热门文章

  1. POJ 2392 Space Elevator(多重背包变形)
  2. string wstring
  3. Win能ping通win7,但是无法访问共享的解决方法
  4. 解决 github clone慢
  5. Excel中的图片,突然全部消失不见,如何解决
  6. 层次聚类分析代码_4个步骤,用聚类分析法实现用户分析!
  7. 解决重装 Oracle 出现的 INS-32025 问题,完全卸载 Oracle11g
  8. git push错误解决方案
  9. PHP微信公众号支付弹出“NaN:undefined”解决方法
  10. 如何解决System.Web.HttpRequestValidationException的异常