面向对象编程的基本原则:

  • 单一职责:一个类,只需要做好一件事
  • 开放封闭:一个类,应该是可扩展的,而不是可修改的
  • 依赖倒置:一个类,不应该强依赖另一个类。每个类对应另外一个类都是可替换的
  • 配置化:尽可能地使用配置,而不是硬编码
  • 面向接口编程:只需要关心接口,不需要关心实现

1、设置类的属性

  1. class ShopProduct {
  2. public $title = 'default product';
  3. public $producterMainName = 'main name';
  4. public $producterFirstName = 'first name';
  5. public $price = 0;
  6. }
  7.  
  8. $product1 = new ShopProduct();
  9.  
  10. //设置属性
  11. $product1->title = "My Antonia";
  12. $product1->producterFirstName = "Cather";
  13. $product1->producterMainName = "Willa";
  14. $product1->price = 5.99;
  15.  
  16. //访问
  17. echo 'author: '.$product1->producterFirstName.' '.$product1->producterMainName;

用以上方法设置属性值会有很多问题:

第一:PHP允许动态设置属性,如果拼错或忘记属性名时并不会得到警告。例如错误地把

  1. $product1->producterMainName = "Willa";

写作

  1. $product1->producterSecondName = "Willa";

,当我们输出作者名字的时候,会有意想不到的结果。

第二:类太过松散,我们没有强制设置标题、价格或者产品名称,客户端代码可以确定的是这些属性存在,但是面对的可能是默认值也可能不是,理想情况下,我们希望实例化ShopProduct对象时设置有意义的属性值。

第三:不得不重复做一些经常做的事,比如多次需要完整输出作者的名字,就要重复使用

  1. echo 'author: '.$product1->producterFirstName.' '.$product1->producterMainName;

改进后的:

2、使用方法

  1. class ShopProduct {
  2. public $title;
  3. public $producterMainName;
  4. public $producterFirstName;
  5. public $price = 0;

  6.    //设置默认值,$this伪变量把类指向一个对象实例,$this可以理解为当前实例
  7. public function __construct($title, $producterMainName, $producterFirstName, $price){
  8. $this->title = $title;
  9. $this->producterMainName = $producterMainName;
  10. $this->producterFirstName = $producterFirstName;
  11. $this->price = $price;
  12. }
  13.    //获取作者名
  14. public function getProducter(){
  15. return $this->producterFirstName.' '.$this->producterMainName;
  16. }
  17.  
  18. }
  19.  
  20. $product1 = new ShopProduct('My Antonia', 'Willa', 'Cather', 5.99);
  21.  
  22. //访问
  23. echo 'author: '.$product1->getProducter();

3、使用AccessArray实现配置文件的加载

ArrayAccess 是提供像访问数组一样访问对象的能力的接口。

  1. Config.php
  1. <?php
  2. namespace Baobab;
  3.  
  4. class Config implements \ArrayAccess{
  5.  
  6. protected $path;
  7. protected $configs = array();
  8. /**
  9. * @param $path 配置文件所在的文件系统目录
  10. */
  11. function __construct($path){
  12. $this->path = $path;
  13. }
  14.  
  15. function offsetGet($key){
  16. if (empty($this->configs[$key])){
  17. $file_path = $this->path.'/'.$key.'.php';
  18. $config = require $file_path;
  19. $this->configs[$key] = $config;
  20. }
  21. return$this->configs[$key];
  22. }
  23.  
  24. function offsetSet($key, $value){
  25. throw new \Exception("can't write config file");
  26. }
  27.  
  28. function offsetExists($key){
  29. return isset($this->configs[$key]);
  30. }
  31.  
  32. function offsetUnset($key){
  33. unset($this->configs[$key]);
  34. }
  35. }

/Configs/database.php

  1. <?php
  2. $config = array(
  3. 'master' => array(
  4. 'type' => 'MySQL',
  5. 'host' => '127.0.0.1',
  6. 'user' => 'root',
  7. 'password' => 'root',
  8. 'dbname' => 'test'
  9. )
  10. );
  11.  
  12. return $config;

index.php

  1. define('BASEDIR',__DIR__);
    $config = new \Baobab\Config(BASEDIR.'/Configs');
  2. //从文件系统加载一个配置文件Configs/database.php
  3. print_r($config['database']);

php面向对象编程 设计模式的更多相关文章

  1. javaScript设计模式之面向对象编程(object-oriented programming,OOP)(二)

    接上一篇 面向对象编程的理解? 答:面向对象编程,就是将你的需求抽象成一个对象,然后针对这个对象分析其特征(属性)与动作(方法).这个对象我们称之为类.面向对象编程思想其中一个特点就是封装,就是把你需 ...

  2. Python设计模式面向对象编程

    前言   本篇文章是基于极客时间王争的<设计模式之美>做的总结和自己的理解.  说到面向对象编程,作为一个合格的Pythoner,可以说信手拈来.毕竟在Python里"万物都是对 ...

  3. PHP 面向对象编程和设计模式 (1/5) - 抽象类、对象接口、instanceof 和契约式编程

    PHP高级程序设计 学习笔记 2014.06.09 什么是面向对象编程 面向对象编程(Object Oriented Programming,OOP)是一种计算机编程架构.OOP 的一条基本原则是计算 ...

  4. js原生设计模式——3简单工厂模式\js面向对象编程实例

    <!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8&qu ...

  5. javaScript设计模式之面向对象编程(object-oriented programming,OOP)(一)

    面试的时候,总会被问到,你对javascript面向对象的理解? 面向对象编程(object-oriented programming,OOP)是一种程序设计范型.它讲对象作为程序的设计基本单元,讲程 ...

  6. 进击的Python【第六章】:Python的高级应用(三)面向对象编程

    Python的高级应用(三)面向对象编程 本章学习要点: 面向对象编程介绍 面向对象与面向过程编程的区别 为什么要用面向对象编程思想 面向对象的相关概念 一.面向对象编程介绍 面向对象程序设计(英语: ...

  7. Python黑帽编程2.9 面向对象编程

    Python黑帽编程2.9 面向对象编程 我个人认为,计算机语言的发展,有两个方向,一个是从低到高的发展过程,在这个过程中,语言的思考和解决问题的方式是面向硬件的.硬件本质上处理的是信号,在此基础上, ...

  8. JavaScript的面向对象编程(OOP)(一)——类

    在学习JavaScript面向对象的编程之前,需要知道,并了解面向对象的一些基本的常识.初学者中大多数都以为面向对象中,面向对象的编程是很重要和占据很大一部分精力.笔者在之前也是认为OOP是面向对象的 ...

  9. [.net 面向对象编程基础] (14) 重构

    [.net 面向对象编程基础] (14) 重构 通过面向对象三大特性:封装.继承.多态的学习,可以说我们已经掌握了面向对象的核心.接下来的学习就是如何让我们的代码更优雅.更高效.更易读.更易维护.当然 ...

随机推荐

  1. 窥探Swift编程之强大的Switch

    之前初识Swift中的Switch语句时,真的是让人眼前一亮,Swift中Switch语句有好多特有而且特好用的功能.说到Switch, 只要是写过程序的小伙伴对Switch并不陌生.其在程序中的出镜 ...

  2. mac+php+xdebug+phpstorm在苹果下配置xdebug一波三折

    1.下载xdebug文件 http://xdebug.org/wizard.php 将phpinfo()的源代码复制到文本框中,xdebug会提示如何配置和下载哪个版本的xdebug. 全部下载地址: ...

  3. php使用递归创建多级目录

    <?php header('Content-type:text/html;charset=utf8'); echo "Loading time:".date('Y-m-d H ...

  4. C#: 向Word插入排版精良的Text Box

    Text Box(文本框)是Word排版的工具之一.在Word文档正文的任何地方插入文本框,可添加补充信息,放在合适的位置,也不会影响正文的连续性.我们可以设置文本框的大小,线型,内部边距,背景填充等 ...

  5. opencv 之 icvCreateHidHaarClassifierCascade 分类器信息初始化函数部分详细代码注释。

    请看注释.这个函数,是人脸识别主函数,里面出现过的函数之一,作用是初始化分类器的数据,就是一个xml文件的数据初始化. static CvHidHaarClassifierCascade* icvCr ...

  6. JS函数相关及递归函数的使用

    JS函数相关及递归函数的使用 通用js程序: function 函数名(参数列表) { 函数体 } 可使用alert()输出,也可用return返回值. alert与return区别: functio ...

  7. T-SQL CROSS APPLY、MERGE

    写在前面 刚才看项目里一个存储过程,也是好长时间没有使用Sql Server2008了,好多写法和函数感觉到陌生,这就遇到了CROSS APPLY 和MERGE的语法,两者之前完全没接触过. 所以专门 ...

  8. 【集合框架】JDK1.8源码分析之ArrayList(六)

    一.前言 分析了Map中主要的类之后,下面我们来分析Collection下面几种常见的类,如ArrayList.LinkedList.HashSet.TreeSet等.下面通过JDK源码来一起分析Ar ...

  9. MySQL char与varchar的差异

    字符与字节的区别 一个字符由于所使用的字符集的不同,会并存储在一个或多个字节中,所以一个字符占用多少个字节取决于所使用的字符集 注意:char与varchar后面接的数据大小为存储的字符数,而不是字节 ...

  10. 关于SQL储存过程中输出多行数据

    declare @num1 int           --为符合条件的总行数 select @num1=COUNT(1) from cardInfo where openDate between @ ...