PHP設計模式(二):抽象類和接口

原文地址:PHP設計模式(二):抽象類和接口php

Introduction

對於編程來講,對事物的抽象是一個老生常談的話題,抽象問題更利於面向對象編程以及程序設計模式。
和C/C++,Java,Python等語言同樣,PHP也支持面向對象,可是又有略微區別,如PHP支持在接口中定義常量,可是不支持抽象變量。編程

抽象/Abstraction

對事物的抽象是指,區別兩個不一樣事物之間的本質特徵,這兩個事物應該在某個視角上有明確的區分界限。設計模式

如,鯨魚和鯉魚,這兩個事物在動物的視角上,有明確的區分界限,屬於不一樣的動物;可是在水生動物的視角上,他們屬於同一種動物的抽象。
合理的對問題進行抽象,構造模型,將更容易經過編程來解決問題。
記住:抽象是編程解決問題的基礎,越複雜的問題,越須要一開始就對問題進行抽象,而不是直接寫代碼。bash

抽象類/Abstract Class

抽象類是一個編程概念,PHP中叫Abstract Classes。在設計模式中,抽象類不可以被實例化/初始化,可是能夠依靠具體類的繼承來實現。
有點抽象,對吧?用代碼來解釋:this

<?php
abstract class Animal {
  public $name;
  abstract public function eat($food);
}
?>

定義了動物這個抽象類,動物的屬性是名字name,而後有一個方法是吃食物eat food。
爲何動物是抽象類?由於動物這個物種並非一個存在於天然界的東西,它是人類腦海裏抽象出的東西。存在天然界的是鯨魚和鯉魚這樣的肯定性動物。
好比鯨魚的概念,應該是屬於動物,繼承Animal類,咱們定義鯨魚這個類以及吃東西的方法:設計

<?php
class Whale extends Animal {
  public function __construct() {
    $this->name = "Whale";
  }
  public function eat($food) {
    echo $this->name . " eat " . $food . ".\n";
  }
}
?>

如今咱們能夠初始鯨魚類,而且調用吃的方法了:code

<?php
  $whale = new Whale();
  $whale->eat("fish");
?>

運行一下:server

$ php Whale.php
Whale eat fish.

接口/Interface

PHP也支持面向過程編程概念中的接口,下面一樣用鯨魚的例子來說述:對象

<?php
interface IAction {
  public function eat($food);
  public function swim();
}
?>

一樣定義一個鯨魚類,來實現上述接口:繼承

<?php
class Whale implements IAction {
  public function eat($food) {
    echo "Whale eat " . $food . "\n.";
  }
  public swim() {
    echo "Whale is swimming.\n";
  }
}
?>

如今咱們能夠初始鯨魚類,而且調用吃的方法了:

<?php
  $whale = new Whale();
  $whale->eat("fish");
?>

運行一下:

$ php Whale.php
Whale eat fish.

抽象類vs接口

上面的抽象類和接口的例子,看上去是否是相似?事實上,對於PHP編程來講,抽象類能夠實現的功能,接口也能夠實現。
抽象類的接口的區別,不在於編程實現,而在於程序設計模式的不一樣。
通常來說,抽象用於不一樣的事物,而接口用於事物的行爲。
如:水生生物是鯨魚的抽象概念,可是水生生物並非鯨魚的行爲,吃東西纔是鯨魚的行爲。
對於大型項目來講,對象都是由基本的抽象類繼承實現,而這些類的方法一般都由接口來定義。
此外,對於事物屬性的更改,建議使用接口,而不是直接賦值或者別的方式,如:

<?php
interface IAction {
  public function eat();
}
class Whale implements IAction {
  public function eat() {
    echo "Whale eat fish.\n";
  }
}
class Carp implements IAction {
  public function eat() {
    echo "Carp eat moss.\n";
  }
}

class Observer {
  public function __construct() {
    $whale = new Whale();
    $carp = new Carp();
    $this->observeEat($whale);
    $this->observeEat($carp);
  }
  function observeEat(IAction $animal) {
    $animal->eat();
  }
}
$observer = new observer();
?>

運行一下:

$ php Observer.php
Whale eat fish.
Carp eat moss.

Summary

好的設計模式是嚴格對問題進行抽象,雖然抽象類和接口對於編程實現來講是相似的,可是對於程序設計模式是不一樣的。

相關文章
相關標籤/搜索