无法在一个class上extend多个abstract class,但是你可以use多个trait abstract class是在类型系统上做文章,trait片段是mixin 类型约束 代码复用 class 是 是 interface 是 否 trait 否 是
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)原则,达到多继承的目的
无法在一个class上extend多个abstract class,但是你可以use多个trait
abstract class是在类型系统上做文章,trait片段是mixin