php trait编译实现,为什么PHP Trait不能实现接口?
真正的短版本更简单,因为你不能。这不是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不能实现接口?相关推荐
- trait功能 php,PHP之Trait功能与用法实例分析
本文实例讲述了PHP Trait功能与用法.分享给大家供大家参考,具体如下: Trait 是为类似 PHP 的单继承语言而准备的一种代码复用机制. 1.如果引入的Trait有同名的方法trait A{ ...
- trait php中,php中trait的使用
1.trait是什么? Trait可以看做类的部分实现,可以混入一个或多个现有的PHP类中,其作用有两个:表明类可以做什么:提供模块化实现.Trait是一种代码复用技术,为PHP的单继承限制提供了一套 ...
- ubuntu14.04下安装cudnn5.1.3,opencv3.0,编译caffe及配置matlab和python接口过程记录
已有条件: ubuntu14.04+cuda7.5+anaconda2(即python2.7)+matlabR2014a 上述已经装好了,开始搭建caffe环境. 1. 装cudnn5.1.3,参照: ...
- avro的c语言api,在CentOS/RHEL上编译序列化软件Avro的C语言接口库
消息由键,值和头部组成.Kafka不识别消息中键和值,它按字节数组处理他们.但生产者和消费者关心如何读取这些数据.所以我们希望数据存储的方式是易读的,同时它还要尽可能地紧凑和快速编解码.例如,JSON ...
- Spark基础-scala学习(三、Trait)
面向对象编程之Trait trait基础知识 将trait作为接口使用 在trait中定义具体方法 在trait中定义具体字段 在trait中定义抽象字段 trait高级知识 为实例对象混入trait ...
- scala学习笔记-面向对象编程之Trait
将trait作为接口使用 1 // Scala中的Triat是一种特殊的概念2 // 首先我们可以将Trait作为接口来使用,此时的Triat就与Java中的接口非常类似3 // 在triat中可以定 ...
- Scala学习教程笔记二之函数式编程、Object对象、伴生对象、继承、Trait、
1:Scala之函数式编程学习笔记: 1:Scala函数式编程学习:1.1:Scala定义一个简单的类,包含field以及方法,创建类的对象,并且调用其方法:class User {private v ...
- corutine rust_Rust学习笔记#5:函数和trait
函数 基本语法 Rust的函数使用fn关键字开头,函数可以有一系列的输入参数,还有一个返回类型.函数返回可以使用return语句,可以使用表达式.下面是一个标准函数的示例,add函数接受两个i32的参 ...
- 28.特性trait.rs
/* 特性(trait)概念接近于 Java 中的接口(Interface),但两者不完全相同.特性与接口相同的地方在于它们都是一种行为规范,可以用于标识哪些类有哪些方法 trait Descript ...
最新文章
- conda创建虚拟环境 和 用conda创建GPU的cuda、cudnn使用环境
- Linux下备份cisco路由配置
- Android官方开发文档Training系列课程中文版:使用Fragment构建动态UI之构建灵活的UI
- tomcat 设置java_为tomcat配置java环境变量
- 生产者消费者_Kafka之生产者/消费者
- pandas pivot 计算占比_pandas使用9:如何处理时间序列数据
- linux查看系统版本_Windows电脑如何查看电脑系统位数及版本号
- wcf、web api、webservicer 之间的区别
- Luogu1306 斐波那契公约数
- 分享如何搭建手机工作室网络
- git reset 3种方式
- 外行朋友值得一读的5本经典数学书
- 在github上下载的.md文件怎么打开
- BDB(ICCV2019)
- 【计算机网络】 IP地址划分
- HTML字母导航栏怎么做,html导航栏下拉菜单怎么制作?这里有详细的代码实例
- SAP-ABAP学习-20230307
- web前端开发经验总结
- CSS之邂逅 (一):认识CSS、编写CSS样式、CSS注释、常见的CSS属性
- rz: xxxxxxx removed
热门文章
- POJ 2392 Space Elevator(多重背包变形)
- string wstring
- Win能ping通win7,但是无法访问共享的解决方法
- 解决 github clone慢
- Excel中的图片,突然全部消失不见,如何解决
- 层次聚类分析代码_4个步骤,用聚类分析法实现用户分析!
- 解决重装 Oracle 出现的 INS-32025 问题,完全卸载 Oracle11g
- git push错误解决方案
- PHP微信公众号支付弹出“NaN:undefined”解决方法
- 如何解决System.Web.HttpRequestValidationException的异常