过程式代码表现的行为就是一系列命令和方法的连续调用,控制代码根据不一样的条件执行不一样的职责代码。这种自顶向下的控制方式致使了重复和相互依赖的代码遍及于整个项目。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的读方法 } }