PHP面向對象三大特性:封裝、繼承、多態

算法提升程序運行的速度,而設計模式提升編程的速度。php

php是面向對象的腳本語言,而咱們都知道,面向對象的語言具備三大特性封裝繼承多態算法

抽象類和接口

抽象/Abstraction編程

一個類中,只要有一個抽象方法,這個類必須被聲明爲抽象類。
抽象方法在子類中必須被重寫。
其實抽象類和接口類有一部分很像,記得在哪裏看見這樣一句話,抽象類就把類像的部分抽出來,設計模式

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

抽象類是一個編程概念,PHP中叫Abstract Classes。在設計模式中,抽象類不可以被實例化/初始化,可是能夠依靠具體類的繼承(extends )來實現。學習

接口/Interfacethis

PHP也支持面向過程編程概念中的接口,PHP支持在接口中定義常量,可是不支持抽象變量關鍵詞implements 實現接口。
接口中的全部方法都要求是抽象方法,因此就不須要在方法前使用abstract關鍵字標識了。並且在接口中也不須要顯式地使用public訪問權限進行修飾,由於默認權限就是public的,也只能是公有的。.net

PHP接口類interface就是一個類的領導者,指明方向,子類必須完成它指定方法。設計

<?php
interface 接口名稱{ //使用interface關鍵字聲明接口
常量成員 //接口中的成員屬性只能是常量,不能是變量
抽象方法 //接口中的全部方法必須是抽象方法,不能有非抽象的方法存在
}
?>

下面一樣用鯨魚的例子來說述:code

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

抽象類vs接口

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

在學習PHP面向對象時,都會在抽象類與接口上迷惑,做用差很少爲何還那麼容易混淆,何不留一去一?可是事實上二者的區別仍是很大的,若是可以很好地運用PHP的兩個方法,面向對象的程序設計將會更加合理、清晰高效。

  • 對接口的使用方式是經過關鍵字implements來實現的,而對於抽象類的操做是使用類繼承的關鍵字exotends實現的,使用時要特別注意。

  • 接口沒有數據成員,可是抽象類有數據成員,抽象類能夠實現數據的封裝。

  • 接口沒有構造函數,抽象類能夠有構造函數。

  • 接口中的方法都是public類型,而抽象類中的方法可使用private、protected或public來修飾。

  • 一個類能夠同時實現多個接口,可是隻能實現一個抽象類。
    PHP的抽象類、接口的區別和選擇

相同點:(注意抽象方法沒有方法體,並且方法結束使用 ; 號,非抽象方法必須有方法體即{},能夠不寫具體內容)函數體內不能寫任何東西,連兩個大括號都不能寫!!!如:function getName();這樣就好了

封裝

封裝/Encapsulation

對事物的封裝是指,將事物進行抽象後,提供抽象概念的實現的具體方法。

聽起來很拗口,仍是舉鯨魚的例子。
對於鯨魚來講,須要吃東西這個行爲,吃自己是一個抽象的概念,由於具體到怎麼吃,是咀嚼和消化的過程,甚至如何咀嚼和消化也是不可見的。對外部而言,可見的只是吃這一個接口,如何吃、怎麼吃,是被封裝在了鯨魚的實現中。
甚至能夠說,消化系統,被封裝到了鯨魚這個對象中,對外部不可見,僅僅鯨魚本身可見

封裝方法


和別的程序設計語言同樣,PHP也只是三種封裝概念:Private,Protected,Public。

私有/Private
私有的概念是,僅僅對象內部可見,外部不可見

保護/Protected

保護的概念是,僅僅是自身類和繼承類可見,這個關鍵字的用途主要是防止濫用類的派生,另外三方庫編寫的時候會用到,防止誤用。

繼承

繼承/Inheritance
仍是用動物、鯨魚和鯉魚來舉例:

<?php
abstract class Animal {
  protected $name;

  protected function chew($food) {
    echo $this->name . " is chewing " . $food . ".\n";
  }
  protected function digest($food) {
    echo $this->name . " is digesting " . $food . ".\n";
  }
}

class Whale extends Animal {
  public function __construct() {
    $this->name = "Whale";
  }
  public function eat($food) {
    $this->chew($food);
    $this->digest($food);
  }
}

class Carp extends Animal {
  public function __construct() {
    $this->name = "Carp";
  }
  public function eat($food) {
    $this->chew($food);
    $this->digest($food);
  }
}

$whale = new Whale();
$whale->eat("fish");
$carp = new Carp();
$carp->eat("moss");
?>

運行一下:

$ php Inheritance.php
Whale is chewing fish.
Whale is digesting fish.
Carp is chewing moss.
Carp is digesting moss.

對於一個好的程序設計,須要:

類和類之間應該是低耦合的。

繼承一般是繼承自抽象類,而不是具體類。

一般直接繼承抽象類的具體類只有一層,在抽象類中用protected來限定。

Summary

合理的繼承對於好的程序設計一樣是必不可少的,結合abstract和protected,能讓你編寫出結構清晰的代碼。

繼承權限:private、protected、public三者權限控制不能小於父類能夠擴大父類權限

多態

多態是指在面向對象中可以根據使用類的上下文來從新定義或改變類的性質和行爲。

惟獨這個多態,php體現的十分模糊。緣由是php是弱類型語言。

<?php
interface IEat {
  function eatFish();
  function eatMoss();
}

class Whale implements IEat {
  public function eatFish() {
    echo "Whale eats fish.\n";
  }
  public function eatMoss() {
    echo "Whale doesn't eat fish\n";
  }
}

class Carp implements IEat {
  public function eatFish() {
    echo "Carp doesn't eat moss.\n";
  }
  public function eatMoss() {
    echo "Carp eats moss.\n";
  }
}

$whale = new Whale();
$whale->eatFish();
$whale->eatMoss();
$carp = new Carp();
$carp->eatFish();
$carp->eatMoss();
?>

運行一下:

$ php Inheritance.php
Whale eats fish.
Whale doesn't eat fish.
Carp eats moss.
Carp doesn't eat moss.
相關文章
相關標籤/搜索