本文主要和大家分享PHP之面向物件多態實例詳解,多態是指在物件導向中能夠根據使用類別的上下文來重新定義或改變類別的性質和行為,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); }?>
相關建議:
以上是PHP之物件導向多型實例詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!