2019独角兽企业重金招聘Python工程师标准>>>

第二章 面向对象的设计原则

2.1 面向对象设计的五大原则

单一职责原则
接口隔离原则
开放-封闭原则
替换原则

依赖倒置原则

2.1.1 单一职责原则SRP

单一职责有两个含义:一个是避免相同的职责分散到不同的类中,另一个是避免一个类承担太多的职责。

原因 1可以减少类之间的耦合 2提高类的复用性

class Config{public $host="localhost";static $port="3306";static $user="root";static $password="";public $charset="utf8";public $database="test";public $file="";
}
interface Db_Adapter{public function connect($config);public function query($query,$handle);
}class Db_Adapter_Mysql implements Db_Adapter{private $_dbLink;public function connect($config){if($this->_dbLink=@mysql_connect($config->host.(empty($config->port)?'':':'.$config->port),$config->user,$config->password,true)){if(@mysql_select_db($config->database,$this->_dbLink)){if($config->charset){mysql_query("SET NAMES '{$config->charset}'",$this->_dbLink);}return $this->_dbLink;}}/**数据库异常**/throw new Db_Exception(@mysql_error($this->_dbLink));}public function query($query,$handle){if($resource=@mysql_query($query,$handle)){return $resource;}}
}
class Db_Exception extends exception{function __toString(){return "<div style='color:red'>Exception{$this->getCode()}:{$this->getMessage()} in File:{$this->getFile()} on line:{$this->getLine()}</div>";}
}class Db_Adapter_sqlite implements Db_Adapter{private $_dbLink;public function connect($config){if($this->_dbLink=sqlite_open($config->file,0666,$error)){return $this->_dbLink;}throw new Db_Exception($error);}public function query($query,$handle){if($resource=@sqlite_query($query,$handle)){return $resource;}}
}class sqlFactory{public static function factory($type){$classname='Db_adapter_'.$type;return new $classname;}
}$config=new Config();
$connect=sqlFactory::factory("mysql")->connect($config);
$connect=sqlFactory::factory("SQLite")->connect($config);
class cook{public function meal(){echo "番茄炒蛋",PHP_EOL;}public function drink(){echo "紫菜蛋花汤",PHP_EOL;}public function ok(){echo '完毕',PHP_EOL;}
}interface Command{public function execute();
}class MealCommand implements Command{private $cook;public function __construct(cook $cook){$this->cook=$cook;}public function execute(){$this->cook->meal();}
}class DrinkCommand implements Command{private $cook;public function __construct(cook $cook){$this->cook=$cook;}public function execute(){$this->cook->drink();}
}class cookControl{private $mealcommand;private $drinkcommand;public function addCommand(Command $mealcommand,Command $drinkcommand){$this->mealcommand=$mealcommand;$this->drinkcommand=$drinkcommand;}public function callmeal(){$this->mealcommand->execute();}public function calldrink(){$this->drinkcommand->execute();}
}$control=new cookControl;
$cook=new cook;
$mealcommand=new MealCommand($cook);
$drinkcommand=new DrinkCommand($cook);
$control->addCommand($mealcommand,$drinkcommand);
$control->callmeal();
$control->calldrink();

2.1.2 接口隔离原则 ISP

利用委托分离接口
利用多继承分离接口

2.1.3 开放-封闭原则 OCP

1.什么是开放-封闭原则
一个模块在扩展性方面应该是开放的而在更改性能方面应该是封闭的。

interface process{public function process();
}class playerencode implements process{public function process(){echo "encode\r\n";}
}class playeroutput implements process{public function process(){echo "output\r\n";}
}class playProcess{private $message=null;public function __construct(){}public function callback(event $event){$this->message=$event->click();if($this->message instanceof process){$this->message->process();}}
}class mp4{public function work(){$playProcess=new playProcess();$playProcess->callback(new event('encode'));$playProcess->callback(new event('output'));}
}class event{private $m;public function __construct($me){$this->m=$me;}public function click(){switch($this->m){case 'encode':return new playerencode();break;case 'output':return new playeroutput();break;}}
}$mp4=new mp4;
$mp4->work();

2 如何遵守开放-封闭原则
1)在设计方面充分应用 “抽象”和“封装”的思想。
2)在系统功能编程实现方面应用面向接口的编程。

2.1.4 替换原则 LSP

子类必须能够替换掉它们的父类型,并且出现在父类型能够出现的任何地方。

2.1.5 依赖倒置原则 DIP

上层模块不应该依赖于下层模块,它们共同依赖于一个抽象(父类不能依赖子类,它们都要依赖抽象类)
抽象不能依赖于具体,具体应该依赖于抽象。

2.2 一个面向对象留言本的实例

class message{public $name;public $email;public $content;public function __set($name,$value){$this->name=$value;}public function __get($name){if(!isset($this->$name)){$this->$name=NULL;}}
}class gbookModel{private $bookPath;private $data;public function setBookPath($bookPath){$this->bookPath=$bookPath;}public function getBookPath(){return $this->bookPath;}public function open(){}public function close(){}public function read(){return file_get_contents($this->bookPath);}public function write($data){$this->data=self::safe($data)->name."&".self::safe($data)->email."\r\nsaid:\r\n".self::safe($data)->content;return file_put_contents($this->bookPath,$this->data,FILE_APPEND);}public static function safe($data){$reflect=new ReflectionObject($data);$props=$reflect->getProperties();$messagebox=new stdClass();foreach($props as $prop){$ivar=$prop->getName();$messagebox->$ivar=trim($prop->getValue($data));}return $messagebox;}public function delete(){file_put_contents($this->bookPath,'it\'s empty now');}public function readByPage(){$handle=file($this->bookPath);$count=count($handle);$page=isset($_GET['page'])? intval($_GET['page']):1;if($page<1 || $page>$count) $page=1;$pnum=9;$begin=($page-1)*$pnum;$end=($begin+$pnum)>$count?$count:$begin+$pnum;for($i=$begin;$i<$end;$i++){echo '<strong>',$i+1,'</strong>',$handle[$i],'<br/>';}for($i=1;$i<ceil($count/$pnum);$i++){echo "<a href=?page=${i}>${i}</a>";}}
}class leaveModel{public function write(gbookModel $gb,$data){$book=$gb->getBookPath();$gb->write($data);}
}class authorControl{public function message(leaveModel $l,gbookModel $g,message $data){$l->write($g,$data);}public function view(gbookModel $g){return $g->read();}public function viewByPage(gbookModel $g){return $g->readByPage();}public function delete(gbookModel $g){$g->delete();echo self::view($g);}}$message=new message;
$message->name='lilu';
$message->email='lilugirl2005@126.com';
$message->content='a crazy phper love php so much.';
$gb=new authorControl();
$pen=new leaveModel();
$book=new gbookModel();
$book->setBookPath("C:\wamp2\a.txt");
$gb->message($pen,$book,$message);
//echo $gb->view($book);
echo $gb->viewByPage($book);
//$gb->delete($book);

2.3 面向对象的思考

转载于:https://my.oschina.net/lilugirl2005/blog/212553

PHP核心技术与最佳实践 读书笔记 第二章 面向对象的设计原则相关推荐

  1. 大数据之路、阿里巴巴大数据实践读书笔记 --- 第二章、日志采集

    一.日志采集两大体系: Aplus.JS   PC-WEB端 UserTrack   App-端 二.主要统计: 页面浏览(展示)日志采集 PV - Page View  页面浏览量 UV - Uni ...

  2. 《计算传播学导论》读书笔记——第二章文本分析简介

    <计算传播学导论>读书笔记--第二章文本分析简介 第一节 文本分析研究现状 常用文本挖掘技术 第二节 文本分析与传播学研究 (一)为什么文本挖掘技术逐渐受到传播学者的关注 (二)不同文本分 ...

  3. 深入Ajax架构和最佳实践读书笔记

    在Web开发中,因为Ajax 是前端和后台交互的主要方式之一,其他的交互方式有Flash,Slverlight.特别是网页游戏,大多数还是采用Flash,一方面可以使用 ActionScript来编写 ...

  4. 《软件测试经验与教训》读书笔记---第二章

    <软件测试经验与教训>读书笔记--目录 第一章 测试员的角色 第二章 按测试员的方式思考 第三章 测试手段 第四章 程序错误分析 第五章 测试自动化 第六章 测试文档 第七章 与程序员交互 ...

  5. In-memory Computing with SAP HANA读书笔记 - 第二章:SAP HANA overview

    本文为In-memory Computing with SAP HANA on Lenovo X6 Systems第二章SAP HANA overview的读书笔记. 本章最重要的部分是SAP HAN ...

  6. C++ Primer Plus读书笔记第二章

    自学了一段时间的C++打算还是要系统的整理一下一些知识点,让学习思路更清晰,不然老是学一点忘一点,这个读书笔记用来记录这段时间对C++ Primer Plus一书中知识点的记录,尽量会写的详细一点.直 ...

  7. 计算机网络(第五版 作者:AndrewS.Tanenbaum David J.Wetherall 清华大学出版社)读书笔记----第二章的学习

    计算机网络第二章--物理层读书笔记 1.物理层是网络的技术设置,物理层的材质和带宽决定了最大的传输速率. 2.传输介质的分类:引导性(有线介质)和非引导性(无线介质). (1)有线介质:磁介质.双绞线 ...

  8. 《辛雷学习方法》读书笔记——第二章 心态

    第二章 心态   (1)保持良好心态:学习时保持良好心态,你才能比较容易入门.深入掌握知识.灵活运用知识.学习时始终保持着轻松愉悦振奋的心情,你就容易产生学习心得,更容易灵活运用. (2)爱情对心态影 ...

  9. 《性能之巅—洞悉系统、企业与云计算》读书笔记---第二章

    目录 第二章  方法 2.1术语 2.2模型 2.3概念 2.4视角 2.5方法 2.6建模 2.7容量规划 2.8统计 2.9监视 2.10可视化 第二章  方法 面对一个性能不佳且复杂的系统环境时 ...

最新文章

  1. CentOS7,使用tar命令解压缩文件
  2. 7 ArcMap能复制,不能粘贴
  3. javascript实现页面滚屏效果
  4. mysql信息函数和加密函数_MYSQL 常用函数(数学、字符串、日期时间、系统信息、加密)...
  5. 麒麟990 5G芯片加持!华为nova 6 5G通过3C认证
  6. 阶段3 1.Mybatis_01.Mybatis课程介绍及环境搭建_01.mybatis课程介绍
  7. mysql db for python_Python使用MySQLdb for Python操作数据库教程
  8. 用Python做入门OJ题
  9. 变分法和欧拉-拉格朗日方程(E-L equation)
  10. 全球连接器厂商TOP 50!(含具体分析报告)
  11. 苹果笔记本访问服务器共享文件夹,mac查看win7共享文件怎么操作_mac如何访问win7共享文件夹-win7之家...
  12. Linux 编jpeg函数,JPEG图形库:libjpeg,在LINUX下如何将jpg转换成bmp
  13. 数学表达式: 从恐惧到单挑 (7. min 与 argmin)
  14. 视频去水印工具-在线短视频去水印工具
  15. 英语语法总结--特殊词精讲
  16. 智能电视 = Android + 高清大屏幕 ?
  17. phpstudy不能启动mysql_phpStudy启动后为什么MYSQL无法启动
  18. 记一次使用百度云加速开启ssl后网站打不开的解决办法
  19. node.js关于一个js文件引用另一个js文件里面的函数或者数组变量
  20. 智能车学习日记【一】——让小车跑正方形赛道(摄像头图像处理赛道)

热门文章

  1. vue openlayer单击地图事件循环多次执行_Vue中$nextTick的理解
  2. kafka实现组内广播
  3. 要认识流程管理的局限性
  4. 在VB中如何让背景图片铺满整个MDIForm
  5. [原创]物探小宽线坐标快速生成(平行线坐标互算 、点到线距离计算、两线交点计算等)...
  6. 干货警告!476个PyTorch资源大合集推荐,GitHub超过3600星
  7. 腾讯超级大脑发布!马化腾要用三张智能网络,打造AI in All通用操作系统
  8. 阿里无人车,正在高速过弯
  9. vi 和vim的区别
  10. 给模型添加ORM,与持久化记录