通过对象组合水平扩展PHP类功能
基本实现
所谓对象组合,简而言之,就是在一个类中组合(或者说依赖)另一个类而不是继承另一个类来扩展他的功能,如果说类继承是垂直扩展类功能,那么对象组合则是水平扩展类功能,某种角度说,这也是对单继承机制的一种补充,是的类具有水平扩展的功能。
//以汽车和动力来源的关系举例子,汽车依靠汽油或者电力才能启动
interface CarContract
{
public function drive();
public function power(Gas $gas);
}
abstract class BaseCar implements CarContract
{
protected $brand;
public function __construct($brand)
{
$this->brand = $brand;
}
abstract public function drive();
abstract public function power(Gas $gas);
}
class LynkCo01 extends BaseCar
{
public function __construct()
{
$this->brand = ‘领克01‘;
}
public function drive()
{
echo "启动{$this->brand}汽车" . PHP_EOL;
}
public function power(Gas $gas)
{
echo "动力来源: " . $gas . PHP_EOL;
}
}
通过Trait 水平扩展PHP类功能。
基本使用
Trait结构通过关键字Trait定义:
trait Power
{
protected function gas()
{
return ‘汽油‘;
}
protected function battery()
{
return ‘电池‘;
}
}
类中通过use关键字引入
class Car
{
use Power;
public function drive()
{
echo "动力来源:" . $this->gas() . PHP_EOL;
echo "汽车启动..." . PHP_EOL;
}
}
可见性
Trait 和类一样,支持属性和方法以及可见性设置(private、protected、public),并且即使是 private 级别的方法和属性,依然可以在使用类中调用:
trait Power
{
protected function gas()
{
return ‘汽油‘;
}
public function battery()
{
return ‘电池‘;
}
private function water()
{
return ‘水‘;
}
}
class Car
{
use Power;
public function drive()
{
echo "动力来源:" . $this->water() . PHP_EOL;
echo "切换动力来源:" . $this->battery() . PHP_EOL;
echo "切换动力来源:" . $this->gas() . PHP_EOL;
echo "汽车启动..." . PHP_EOL;
}
}
$car = new Car();
$car->drive();
使用Trait不同于类继承,完全是把Trait的所有代码组合到类中,变成了类的一部分,所以Trait中定义的属性类中就不能在重复定义了。