PHP面向物件程式設計(二)
阿新 • • 發佈:2020-07-20
通過物件組合水平擴充套件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 和類一樣,支援屬性和方法以及可見性設定(private
、protected
、public
),並且即使是 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中定義的屬性類中就不能在重複定義了。