PHP面向?qū)ο笾庋b,繼承與多態(tài)詳解
在普通的編程中,沒有涉及架構(gòu)或者良好的設計,絕大多數(shù)都是使用的面向過程的方式。
當編程逐步深入后,就需要合理使用面向?qū)ο蟮闹R來設計程序,而不是簡單地腦海里有了思路就去寫代碼來實現(xiàn),這是比較低級的做法。
面向?qū)ο蟮娜筇攸c:封裝、繼承、多態(tài)。
封裝、繼承比較好理解,通過一個例子就能看明白:
<?php class VisualObj{ private $Viual=true; protected $width; protected $height; protected $name; } class ActiveX extends VisualObj{ const NamePrefix="ActiveX"; protected static $count=0; public function __construct(string $name,int $width=100,int $height=50){ $this->width=$width; $this->height=$height; self::$count=self::$count+1; if($name==''||$name==null){ $this->SetName(); }else{ $this->name=$name; } } public function GetName(){ return $this->name; } public function SetName(){ $this->name=self::NamePrefix.$this->GetCount(); } public function GetCount(){ return self::$count; } public function GetWidth(){ return $this->width; } public function GetHeight(){ return $this->height; } public function __destruct(){ echo "__destruct".$this->GetCount(); } } $obj1=new ActiveX(''); echo $obj1->GetName(); echo "<br>"; echo $obj1->GetWidth(); echo "<br>"; echo $obj1->GetHeight(); echo "<hr/>"; $obj2=new ActiveX("新的控件",120,60); echo $obj2->GetName(); echo "<br>"; echo $obj2->GetWidth(); echo "<br>"; echo $obj2->GetHeight(); echo "<hr/>"; ?>
靜態(tài)變量的理解,以前我們做C/S開發(fā)的時候,拖放控件到設計界面的時候總是能看到控件名字后面的數(shù)字是自動累加的,這個就是靜態(tài)變量在起作用。
通俗的理解多態(tài)就是同樣的方法名和參數(shù)名實現(xiàn)不同的功能。
在PHP中通過一個例子就好理解了。
1、通過接口演示
<?php interface EditObj{ public function SaveAs(); } class ExcelObj implements EditObj{ public function SaveAs(){ echo "編輯Excel的保存"; } } class WordObj implements EditObj{ public function SaveAs(){ echo "編輯Word的保存"; } } class PptObj implements EditObj{ public function SaveAs(){ echo "編輯Ppt的保存"; } } class app{ public static function EndEdit($obj){ $obj->SaveAs(); } } app::EndEdit(new ExcelObj()); echo "<hr/>"; app::EndEdit(new WordObj()); echo "<hr/>"; app::EndEdit(new PptObj()); echo "<hr/>"; class TxtObj{ public function SaveAs(){ echo "編輯Txt的保存"; } } app::EndEdit(new TxtObj()); ?>
2、通過(抽象)類演示
<?php abstract class EditObj{ public abstract function SaveAs(); public function OutInfo(){ echo '輸出信息'; } } class ExcelObj extends EditObj{ public function SaveAs(){ echo "編輯Excel的保存"; } } class WordObj extends EditObj{ public function SaveAs(){ echo "編輯Word的保存"; } } class PptObj extends EditObj{ public function SaveAs(){ echo "編輯Ppt的保存"; } } class app{ public static function EndEdit($obj){ $obj->SaveAs(); } } app::EndEdit(new ExcelObj()); echo "<hr/>"; app::EndEdit(new WordObj()); echo "<hr/>"; app::EndEdit(new PptObj()); echo "<hr/>"; class TxtObj{ public function SaveAs(){ echo "編輯Txt的保存"; } } app::EndEdit(new TxtObj()); ?>
可以看到,最后的TxtObj因為有SaveAs方法,也得到了正確的執(zhí)行。
我們可以加類型限制:
class app{ public static function EndEdit(EditObj $obj){ $obj->SaveAs(); } }
這樣的話,最后的app::EndEdit(new TxtObj());就會報錯了。
還可以加類型判斷:
class app{ public static function EndEdit($obj){ if($obj instanceof EditObj){ $obj->SaveAs(); }else{ echo "輸入的類型錯誤,不能執(zhí)行!"; } } }
這樣事先的錯誤截斷對用戶就會好一些。
對于上面的接口也一樣可以這樣來做,代碼也一樣。
到此這篇關(guān)于PHP面向?qū)ο笾庋b,繼承與多態(tài)詳解的文章就介紹到這了,更多相關(guān)PHP封裝 繼承 多態(tài)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
phpmyadmin提示The mbstring extension is missing的解決方法
這篇文章主要介紹了phpmyadmin提示The mbstring extension is missing的解決方法,分析了錯誤提示的原因與不同平臺的解決方法,具有一定的參考借鑒價值,需要的朋友可以參考下2014-12-12PHP call_user_func和call_user_func_array函數(shù)的簡單理解與應用分析
這篇文章主要介紹了PHP call_user_func和call_user_func_array函數(shù)的簡單理解與應用,結(jié)合實例形式分析了PHP call_user_func和call_user_func_array函數(shù)的基本功能、用法及操作注意事項,需要的朋友可以參考下2019-11-11在php7中MongoDB實現(xiàn)模糊查詢的方法詳解
MongoDB模糊查詢語句相信對大家來說都不陌生,這篇文章主要給大家介紹了在php 7中MongoDB實現(xiàn)模糊查詢的方法,文中給出了詳細的介紹和示例代碼,對大家具有一定的參考學習價值,需要的朋友一起來看看吧。2017-05-05