多態是指在面向對象中能夠根據使用類的上下文來重新定義或改變類的性質和行為。
PHP不支持重載實現多態,但是PHP可以變向的實現多態效果。如下:
class a{ function test($i){ // $i可以是任何類型的變量 print_r $i; } }
上例,可以看出由於PHP是弱類型語言,所以$i可以是任何類型的變量,這樣一個函數就可以實現如java等強類型語言中靠改變參數類型重載方法的多態形式。
這種形式比JAVA的參數類型重載更便捷高效,但也存在問題,如下:
<?php /** 教師類有一個drawPolygon()方法需要一個Polygon類,用來畫多邊形,此方法內部調用多邊形的draw()方法,但由於弱類型,我們可以傳入Circle類,就會調用Circle類的draw方法,這就事與願違了。甚至可以傳入阿貓、阿狗類,如果這些類沒有draw()方法還會報錯。 */ class Teacher{ function drawPolygon($polygon){ $polygon->draw(); } } class Polygon{ function draw(){ echo "draw a polygon"; } } class Circle{ function draw(){ echo "draw a circle"; } } ?>
可以看出這樣靈活的多態,需要一些控制,在PHP5.3以后可以對參數做類型限制,如下:
// 仿java,在變量參數前加一個限制類名 function drawPolygon(Polygon $polygon){ $polygon->draw(); }
這樣就限制了只能傳入Polygon及其子類。
還有一只是改變參數數量的重載,同樣是因為PHP也不支持方法的重載,所以也需要些變通的方法實現,如下:
<?php // 通過可變參數來達到改變參數數量重載的目的 // 不是必須傳入的參數,必須在函數定義時賦初始值 function open_database($DB, $cache_size_or_values=null, $cache_size=null) { switch (function_num_args()) // 通過function_num_args()函數計算傳入參數的個數,根據個數來判斷接下來的操作 { case 1: $r = select_db($DB); break; case 2: $r = select_db($DB, $cache_size_or_values); break; case 3: $r = select_db($DB, $cache_size_or_values, $cache_size); break; } return is_resource($r); } ?>