首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP OOP 機制與模式 (1):抽象類、接口、instanceof、契約式編程

     編輯:PHP 相關知識

學習筆記:2014.06.09

本文系統介紹抽象類、接口、instanceof 操作符、契約式編程,構建可擴展架構的基石。

1. 抽象類

  • 定義公共基類,具體實現留給子類
  • ≥1 抽象方法 ⇒ 類必須 abstract
  • 抽象方法僅聲明簽名,無方法體
  • 子類必須實現所有抽象方法,訪問級別 ≥ 父類
  • 不可實例化,必須被繼承

方法原型

public function prototypeName($protoParam)

實戰:車輛限速

<?php
abstract class Car { abstract function getMaxSpeed(); }
class Roadster extends Car {
    public $speed;
    public function setSpeed($s=0){ $this->speed=$s; }
    public function getMaxSpeed(){ return $this->speed; }
}
class Street {
    public $cars=[]; public $limit;
    public function __construct($l=200){ $this->limit=$l; }
    protected function legal($car){ return $car->getMaxSpeed() < $this->limit; }
    public function add($car){
        if($this->legal($car)){ echo 'Allowed'; $this->cars[]=$car; }
        else { echo 'Too fast'; }
    }
}
$p=new Roadster(); $p->setSpeed(340);
$s=new Street(80); $s->add($p); // Too fast
?>

2. 接口

  • interface 定義,所有方法隱式 public
  • 僅聲明簽名,無實現
  • 類用 implements 實現,可多實現
  • 慣例名稱 I 開頭

接口 + 抽象類結合

abstract class Car { abstract function setSpeed($s=0); }
interface ISpeedInfo { function getMaxSpeed(); }
class Roadster extends Car implements ISpeedInfo {
    public $speed;
    public function setSpeed($s=0){ $this->speed=$s; }
    public function getMaxSpeed(){ return $this->speed; }
}

3. instanceof 操作符

$p = new Roadster();
echo $p instanceof Car;        // 1
echo $p instanceof ISpeedInfo; // 1

檢測:具體類型、繼承鏈、接口實現。

4. 契約式編程

先定接口 (契約),後寫實現。如建築師先畫藍圖。優勢:封裝、並行開發、可測試。

5. 總結對比

抽象類接口
關鍵字abstractinterface
方法體可有非抽象方法全無
繼承extends (單)implements (多)
屬性可定義不可 (僅常量)
訪問級別任意必須 public

PHP 無多重繼承,但「單繼承 + 多接口」完美替代。契約式編程落地架構,是高質量 PHP 開發的基石。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved