多態這個概念,在Java中指的是變量可以指向的對象的類型,可是變量聲明類型的子類。對象一旦創建,它的類型是不變的,多態的是變量。
在PHP5中,變量的類型是不確定的,一個變量可以指向任何類型的數值、字符串、對象、資源等。我們無法說PHP5中多態的是變量。
我們只能說在PHP5中,多態應用在方法參數的類型提示位置。
一個類的任何子類對象都可以滿足以當前類型作為類型提示的類型要求。所有實現這個接口的類,都可以滿足以接口類型作為類型提示的方法參數要求,通俗來講多態就是指同一東西的多種表現形式;
看如下代碼:
- abstract class A{
- public abstract function abc();
- }
- class AB extends A{
- public function abc(){
- echo 'ab';
- }
- }
- class AC extends A{
- public function abc(){
- echo 'ac';
- }
- }
- class T{
- public function abc(){
- echo 't'
- }
- }
- class Client{
- public static function call(A $obj){
- $obj->abc();
- }
- }
- Client::call(new AB());//ab
- Client::call(new AC());//ac
- Client::call(new T()); //error Client類的方法應該為 public static function call($obj){ $obj->climb(); }
如我們創建一個doing()方法,如果是學生則打印上課,如是公司職員則打印上班。
普通做法
使用if判斷
- /**
- * PHP多態性
- * 瓊臺博客
- */
- // 定義學生類
- class student{
- public function cla(){
- echo "學生工正在上課!<br />";
- }
- }
- // 定義職員類
- class office{
- public function Wor(){
- echo "職員正在上班!<br />";
- }
- }
- // 判斷對象類型方法
- function doing($obj){
- if($obj instanceof student){
- $obj->cla();
- }elseif($obj instanceof office){
- $obj->wor();
- }else{
- echo "沒有這個對象!";
- }
- }
- doing(new student()); // 學生正在上課
- doing(new office()); // 職員正在上班
以上結果輸出:
學生正在上課
職員正在上班
這種普通方法有個缺點,就是對象如果很多,那么if..else..很長,不靈活。
多態性做法
定義一個公共抽象方法,所有子類繼承它。
- /**
- * PHP多態性
- * 瓊臺博客
- */
- // 定義一個公共類
- class pub{
- protected function working(){
- echo "本方法需要在子類中重載!";
- }
- }
- // 定義學生類,繼承公共類pub
- class student extends pub{
- public function working(){
- echo "學生工正在上課!<br />";
- }
- }
- // 定義職員類,繼承公共類pub
- class office extends pub{
- public function working(){
- echo "職員正在上班!<br />";
- }
- }
- // 判斷對象類型方法
- function doing($obj){
- if($obj instanceof pub){
- $obj->working();
- }else{
- echo "沒有這個對象!";
- }
- }
- doing(new student()); // 學生正在上課
- doing(new office()); // 職員正在上班
這就是多態的特性,靈活重用。
其它做法
從多態性的實現方式來看,無非就規范了每個類都要重載父類的一個方法,從而達到統一效果。而我們在定義類的時候,自行加上統一的方法也可行,因此以上例子也可以這么實現:
- /**
- * PHP多態性
- * 瓊臺博客
- */
- // 定義學生類
- class student{
- // 定義統一的方法pub
- public function pub(){
- echo "學生工正在上課!<br />";
- }
- }
- // 定義職員類
- class office{
- // 定義統一的方法pub
- public function pub(){
- echo "職員正在上班!<br />";
- }
- }
- // 判斷對象類型方法
- function doing($obj){
- if($obj){
- // 調用類的統一方法
- $obj->pub();
- }else{
- echo '沒有這個對象';
- }
- }
- doing(new student()); // 學生正在上課
- doing(new office()); // 職員正在上班
當然,以上的例子不能說明多態性就能使用這樣的方式搞定,畢竟多態性在復雜的程序設計中,它能有效的達到靈活重用的特性。
多態性也可以理解為一種程序設計方式,而程序設計最終目的無非就是:靈活,多態,重用,高效。
新聞熱點
疑難解答