1. 程式人生 > 實用技巧 >PHP面向物件程式設計(二)

PHP面向物件程式設計(二)

通過物件組合水平擴充套件PHP類功能

基本實現

所謂物件組合,簡而言之,就是在一個類中組合(或者說依賴)另一個類而不是繼承另一個類來擴充套件他的功能,如果說類繼承是垂直擴充套件類功能,那麼物件組合則是水平擴充套件類功能,某種角度說,這也是對單繼承機制的一種補充,是的類具有水平擴充套件的功能。

//以汽車和動力來源的關係舉例子,汽車依靠汽油或者電力才能啟動
<?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定義:

<?php

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 和類一樣,支援屬性和方法以及可見性設定(privateprotectedpublic),並且即使是 private 級別的方法和屬性,依然可以在使用類中呼叫:

<?php

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中定義的屬性類中就不能在重複定義了。