trait 和abstract的区别在哪里、

发布于 2022-09-01 22:43:21 字数 30 浏览 14 评论 0

感觉没区别呢,实在没想出来在那种场景下会有区别

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

夏九 2022-09-08 22:43:21

无法在一个class上extend多个abstract class,但是你可以use多个trait

abstract class是在类型系统上做文章,trait片段是mixin

类型约束代码复用
class
interface
trait
绿萝 2022-09-08 22:43:21

1.php是只支持单继承,不支持多继承

2.abstract相对trait粒度更细,适合将一个服务里的多个类共有的代码部分抽象出来,让子类继承。但是如果有两个服务模块或者多个服务模块有很多相似的代码,比如初始化redis驱动

protected $_cache;
 
public function setCache()
{
    if(empty($this->_cache))
        $this->_cache = CacheDriver::getService("redisCluster");
}

可能项目中很多地方都会用到这段代码,如果将它写在抽象类中,也就是说大部分抽象类都要写这段代码,为了减少这个问题,就可以引入Trait的概念了

trait TraitDemo{
    protected $_cache;
 
    public function setCache()
    {
        if(empty($this->_cache))
            $this->_cache = CacheDriver::getService("redisCluster");
    }
}

然后可以在使用的地方

use TraitDemo;

public function test()
{
    $this->setCache();
    
    $this->_cache->set("key","value")
}

这样可以让很多无关的类使用相同的代码,从而提高代码复用,符合DRY(Don’t Repeat Yourself)原则,达到多继承的目的

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文