多態是除封裝和繼承之外的另一個面象對象的三大特性之一,我個人看來PHP中雖然可以實現多態,但和c++還有Java這些面向對象的語言相比,多 態性並不是那么突出,因為PHP本身就是一種弱類型的語言,不存在父類對象轉化為子類對象或者是子類對象轉化為父類對象的問題,所以多態的應用並不是那么的明顯;所謂多態性是指一段程序能夠處理多種類型對象的能力,比如說在公司上班,每個月財務發放工資,同一個發工資的方法,在公司內不同的員工或是不同職位的員工,都是通過這個方法發放的,但是所發的工資都是不相同的。所以同一個發工資的方法就出現了多種形態。對於面向對象的程序來說,多態就是把子類對象賦值給父類引用,然后調用父類的方法,去執行子類覆蓋父類的那個方法,但在PHP里是弱類型的,對象引用都是一樣的不分父類引用,還是子類引用。
我們現在來看一個例子,首先還是要使用多態就要有父類對象和子類對象的關系。做一個形狀的接口或是抽象類做為父類,里面有兩個抽象方法,一個求 周長的方法,另一個是求面積的方法;這接口的子類是多種不同的形狀,每個形狀又都有周長和面積,又因為父類是一個接口,所以子類里面就必須要實現父類的這 兩個周長和面積的抽象方法,這樣做的目的是每種不同形狀的子類都遵守父類接口的規范,都要有求周長和求面積的方法。
<?php // 定義了一個形狀的接口,里面有兩個抽象方法讓子類去實現 interface Shape { function area(); function perimeter(); } // 定義了一個矩形子類實現了形狀接口中的周長和面積 class Rect implements Shape { private $width; private $height; function __construct($width, $height) { $this->width = $width; $this->height = $height; } function area() { return "矩形的面積是:" . ($this->width * $this->height); } function perimeter() { return "矩形的周長是:" . (2 * ($this->width + $this->height)); } } // 定義了一個圓形子類實現了形狀接口中的周長和面積 class Circular implements Shape { private $radius; function __construct($radius) { $this->radius=$radius; } function area() { return "圓形的面積是:" . (3.14 * $this->radius * $this->radius); } function perimeter() { return "圓形的周長是:" . (2 * 3.14 * $this->radius); } } // 把子類矩形對象賦給形狀的一個引用 $shape = new Rect(5, 10); echo $shape->area() . "<br>"; echo $shape->perimeter() . "<br>"; // 把子類圓形對象賦給形狀的一個引用 $shape = new Circular(10); echo $shape->area() . "<br>"; echo $shape->perimeter() . "<br>"; ?>
上例執行結果:
矩形的面積是:50
矩形的周長是:30
圓形的面積是:314
圓形的周長是:62.8
通過上例我們看到,把矩形對象和圓形對象分別賦給了變量$shape, 調用$shape引用中的面積和周長的方法,出現了不同的結果,這就是一種多態的 應用,其實在我們PHP這種弱類形的面向對象的語言里面,多態的特性並不是特別的明顯,其實就是對象類型變量的變相引用。