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 ...
最新文章
- 调试模式和定时器,看门狗和嘀嗒定时器
- 笔记:面试 - Vue
- gcc优化的简单说明
- Vue提供操作DOM的方法
- Vlan和vtp重要的配置命令
- JAVA入门级教学之(内存中的空指针异常)
- (24)打两拍verilog与VHDL编码(学无止境)
- python如何爬虫eps数据_Python爬虫常用的几种数据保存方式
- 深度理解linux内核零拷贝,面试题:如何理解 Linux 的零拷贝技术?
- C# winFrom 自定义gridview样式制作好看的大屏显示队列
- Excel单元格引用方式
- snapchat_如何截屏和共享Snapchat快照
- nas服务器用户无访问权限,群晖NAS文件权限管理和账户的权限
- wamp5环境配置基础教程
- 机械螺旋缠绕法管道非开挖修复
- testbench——文件读入输出
- Apache Arrow 简介
- python 图像清晰度_图像清晰度评价指标(Python)
- JDK1.7ConcurrentHashMap源码分析
- [Presto]presto REST API
热门文章
- DICOM查询/获取信息模型的研究及关系数据库实现
- 弃用数据库自增ID,曝光一下我自己用到的解决方法之---终结篇
- 给图片添加水印效果图的函数(可以在图片上添加自己的版权和LOGO图片的水印) 【转载】...
- 好东西真多,如何让自己学的能跟上技术的发展呢
- DELL服务器常见报错信息
- Linux 命令汇总!【珍藏版】
- Linux ftp 上传文件 提示 Permission denied 解决办法
- 记一次MySQL中Waiting for table metadata lock的解决方法
- Python2.7-异常和工具
- ubuntu终端执行shell脚本报command not found解决方法