物件導向和面向過程
物件導向和過程式編程的核心區別就是職責分配
過程式代碼錶現的行為就是一系列命令和方法的連續調用,控制碼根據不同的條件執行不同的職責代碼。這種自頂向下的控制方式導致了重複和相互依賴的代碼遍佈於整個項目。
物件導向編程則將職責從用戶端代碼中轉移到專門的對象中,盡量減少相互依賴。
執行個體說明物件導向和面向過程
首先,面對這樣一個需求,寫一個讀取檔案組態工具。
設定檔的格式如下
key:value
面向過程的方式
此時需求明確,實現也簡單,兩個函數搞定
此時代碼較為緊湊且易於維護,但生活不可能一直都是一帆風順,現在需求變更,需要新增一個支援xml檔案讀取、寫入的功能。
此時我們假設,加入if判斷xml尾碼檔案來執行xml的讀取、寫入的方法?這樣read和write函數都要判斷條件,我們需要改兩處地方,如下。
function readParams( $sourceFile ) { $params = []; if (preg_match( "/\.xml$/i", $sourceFile )) { // 執行xml方式的讀取檔案配置方法 } else { // 執行txt方式的讀取檔案配置方法 } return $params;}function writeParams( $params, $sourceFile ) { if ( preg_match( "/\.txt$/i", $sourceFile )) { // 執行寫xml的寫檔案配置方法 } else { // 執行寫txt的寫檔案配置方法 }}
從上面的修改就可以看出,假如需要支援更多的檔案格式,就需要在read和write兩處方法內分別添加來保持資料處理的一致性
物件導向方式
//定義一個抽象的讀寫類abstract class ParamHandler { protected $sourceFile; protected $params = []; function __construct( $source ) { $this->sourceFile = $source; } function addParams( $key, $val ) { $this->params[$key] = $val; } function getAllParams() { return $this->params; } //該處驗證傳入的檔案類型,然後返回相應操作的對象 static function getInstance( $filename ) { if ( preg_match("/\.xml$/i", $filename) ) { return new XmlParseHandler( $filename ); } return new TextParseHandler( $filename ); } abstract function write(); abstract function read();}//定義具體xml的實現子類class XmlParseHandler extends ParamHandler { function write() { //實現xml的寫方法 } function read() { //實現xml的讀方法 }}
以上就介紹了php對象設計進階,包括了方面的內容,希望對PHP教程有興趣的朋友有所協助。