【翻译】Traits in PHP
Trait 本质上是无状态的mixin,是PHP解释器自动完成的『粘贴&拷贝』,区别于继承,它提供的重用是水平性的,很好地提高了代码的可重用。然而错误使用会造成冲突,BUG难以调试。先来看看 trait 的其中一种正确使用方式。
interface Logger
{
public function log($message, $level);
}
class DemoLogger implements Logger
{
public function log($message, $level)
{
echo "Logged message: $message with level $level", PHP_EOL;
}
}
trait Loggable // implements Logger
{
protected $logger;
public function setLogger(Logger $logger)
{
$this->logger = $logger;
}
public function log($message, $level)
{
$this->logger->log($message, $level);
}
}
class Foo implements Logger
{
use Loggable;
}
然后我们可以像下面这样使用:
$foo = new Foo;
$foo->setLogger(new DemoLogger);
$foo->log('It works', 1);
下面是一些错误使用 trait 的范例。
trait T {
protected function foo() {}
}
class A {
public function foo() {}
}
class B extends A
{
use T;
}
这段代码会因为修改 foo函数的可见性而引起报错。
trait T {
public function foo() {
return 1;
}
}
class A {
use T;
public function foo() {
return 2;
}
}
$a = new A;
echo $a->foo();
上面代码会输出 2,trait 中的定义的方法永远不会得到执行。另外,trait 中不应该调用concrete class的任何方法或者属性,看下面例子:
class A
{
use T;
protected $prop = 1;
protected function getProp() {
return $this->prop;
}
}
trait T
{
public function foo()
{
return $this->getProp();
}
}
$a = new A;
echo $a->foo();
上面代码,trait中调用了特定类实例的方法,从而造成 trait 对具体实现类的依赖,丧失了trait代码 的可重用性,这种使用方式是错误的。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
手把手:用Python实现一个基于RSA算法的区块链客户端
区块链作为比特币和其他加密货币的核心技术,在最近几年引起了全世界的注意,但是各国这一颠覆性的技术态度不一,因为其去中心化的分布式结构,可以使用户之间直接进行交流,无需中心节点参与的这种技术模式对银行、证券等机构带来了极大影响。 区块链的技术模式和各国对区块链的态度: G20各国对数字货币观点大盘点,整体友好 老矿工5000字区块链终极指南 而在本篇文章,抛开介绍区块链的技术特点和应用场景,文摘菌手把手的教大家如何用python实现一个基础的区块链,和一个区块链的客户端。 我们实现的区块链有如下几个特性: 可以向区块链中添加多个节点。 工作量证明(PoW)。 简单的节点间冲突解决机制。 使用RSA 加密进行交易。 我们的区块链客户端有如下几个功能: 使用公钥/私钥加密技术生成钱包。(基于RSA算法)。 使用RSA 加密算法生成交易。 我们还实现了2个展示界面
-
下一篇
linux安装jdk
本文介绍的是使用yum方式安装jdk,想要用其他方式绕行。 1.查看yum中管理的可用的JDK软件包列表: yum search java | grep -i --color JDK 结果如下图所示: image 2.选择合适版本,安装jdk,本人选择的是java-1.8.0-openjdk-devel.x86_64 yum install java-1.8.0-openjdk-devel.x86_64 3配置环境变量,打开etc文件下profile vi /etc/profile 在文件内添加 export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.71-2.b15.el7_2.x86_64 export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar export PATH=$PATH:$JAVA_HOME/bin 保存关闭后,执行,让配置生效: source /etc/profile 然后分别输入下面命令确...
相关文章
文章评论
共有0条评论来说两句吧...