過程式代碼表現的行爲就是一系列命令和方法的連續調用,控制代碼根據不一樣的條件執行不一樣的職責代碼。這種自頂向下的控制方式致使了重複和相互依賴的代碼遍及於整個項目。php
面向對象編程則將職責從客戶端代碼中轉移到專門的對象中,儘可能減小相互依賴。編程
首先,面對這樣一個需求,寫一個讀取文件配置工具。
配置文件的格式以下key:value
數組
此時需求明確,實現也簡單,兩個函數搞定函數
<?php //讀配置 function readParams( $sourceFile ) { $params = []; //從$sourceFile中讀取文本參數 return $params; } 寫配置 function writeParams( $params, $sourceFile ) { //寫入文本參數至$sourceFile中 } //客戶端調用代碼 $file = './param.txt'; $arr['k1'] = 'v1'; $arr['k2'] = 'v2'; $arr['k3'] = 'v3'; writeParams( $arr, $file ); // 將數組寫入指定文件中 $output = readParams( $file ); //從文件讀取數組 print_r($output);
此時代碼較爲緊湊且易於維護,但生活不可能一直都是一路順風,如今需求變動,須要新增一個支持xml文件讀取、寫入的功能。工具
此時咱們假設,加入if判斷xml後綴文件來執行xml的讀取、寫入的方法?這樣read和write函數都要判斷條件,咱們須要改兩處地方,以下。this
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兩處方法內分別添加來保持數據處理的一致性code
//定義一個抽象的讀寫類 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的讀方法 } }