设计模式的宗旨就是:重用。

在面向对象中,类是用于生成对象的代码模版,而设计模式是用于解决共性问题的代码模版。

遵循这样的模板,我们可以设快速地设计出优秀的代码。

注意,设计模式只是模板,不是具体的代码。

它是为了代码复用,增加可维护性。

在学习设计模式的时候,有几个概念让我很难接受,这可能是从过程式编程转到面向对象编程的禁锢。

假设有这样一个对象:

class Person
{
    private $name = 'Human';

    public function getName()
    {
        return $this->name;
    }
}

1 变量保存对象

不要觉得变量只能保存整形数字,数组和字符串,变量还可以保存对象的:

$man = new Person;
echo $man->getName();

2 传递对象参数

如果另一个类用到了Person类的属性或方法,那直接穿进去就可以了:

class Student
{
    public function __construct($person)
    {
        echo $person->getName();
    }
}

// 传递对象,最后输出字符串“Human”
$jack = new Student(new Person);

但是这样有一个小问题,当传递给new Student()不是一个Person对象时,如下,

$jack = new Student('abc');

程序就会报错。于是有了第三种做法,限定参数的类型。

3 限定传递参数的类型

在传递参数的时候,就限定参数的类型,这样写:

class Student
{
    public function __construct(Person $person)
    {
        echo $person->getName();
    }
}

// 传递对象,
$jack = new Student(new Person);

这样,传给new Student()的参数必须是Person的实例。

4 用类属性保存对象

还有一种经常用到的做法,就是用一个类的属性保存对象或对象集合。如下:

class Life
{
    public $persons = [];

    public function addPerson(Person $person)
    {
        $this->persons[] = $person;
    }
}

$class = new Life();
$class->addPerson(new Person);
$class->addPerson(new Person);

var_dump($class->persons);

输出值:

array(2) {
  [0]=>
  object(Person)#2 (1) {
    ["name":"Person":private]=>
    string(5) "Human"
  }
  [1]=>
  object(Person)#3 (1) {
    ["name":"Person":private]=>
    string(5) "Human"
  }
}

5 小结

面向对象的设计模式都是围绕上面的情形,做一些组合之后形成的。

所以,理解类之间关系才是重点。

PHP 设计模式--基础的更多相关文章

  1. 设计模式基础:类及类关系的UML表示

    设计模式基础:类及类关系的UML表示 2009-10-26 17:00 by 宗哥, 1891 阅读, 1 评论, 收藏, 编辑 UML中,类关系分为这几种,泛化(generalization), 实 ...

  2. JavaScript设计模式基础(二)

    JavaScript 设计模式基础(一) 原型模式 在以类为中心的面向对象编程语言中,类和对象的关系就像铸模和铸件的关系,对象总是从类中创建.而原型编程中,类不是必须的,对象未必从类中创建而来,可以拷 ...

  3. JavaScript设计模式基础(一)

    模式的起源 模式 起源于建筑学.20世纪70年代,哈佛大学建筑学博士Christopher Alexander和他的团队花大约20年,来研究为解决同一个问题而设计出的不同建筑结构,从中发现那些高质量设 ...

  4. java设计模式--基础思想总结--父类引用操作对象

    看设计模式的相关书籍也有一段时间了,一开始其实是抱着作为java三大框架的基础知识储备来学习的,不过到后来,才发现,在设计模式的一些准则装饰下,java的面向对象威力才真正地体现出来,后面的将会陆续地 ...

  5. Python设计模式 - 基础 - 七大基本原则

    提倡使用设计模式,主要出发点就是实现代码复用,增加代码的扩展性和可维护性.如何设计出简洁.易懂.灵活.优美的代码结构的确是一门学问,透彻理解并践行如下七大原则通常都能取得基本满意的结果: - 单一职责 ...

  6. Python设计模式 - 基础 - 封装 & 继承 & 多态

    面向对象的核心是对象,世间万物都可以看作对象,任何一个对象都可以通过一系列属性和行为来描述,可以包含任意数量和类型的数据或操作.类是用来描述具有相同属性和方法的所有对象的集合.类通常是抽象化的概念,而 ...

  7. java设计模式--基础思想总结--抽象类与架构设计思想

    抽象类?这个东西我感觉没什么卵用啊,又不能拿来new对象,没有具体的对象的抽象类,有什么实际的意义呢?这是很多刚刚接触java抽象类语法时的第一反应(当然,包括我).确实,很多刚刚接触抽象类这个概念的 ...

  8. java设计模式基础 - 解决某一类问题最行之有效的方法,框架是大的设计模式.

    一.单例模式(Singleton) 1.单例对象(Singleton)是一种常用的设计模式.在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在.这样的模式有几个好处: 1>某 ...

  9. JavaScript设计模式基础之this、call、apply

    1.this的指向 除去不常用的with和eval,具体应用中this指向大概能分为4种情况分别是 1.作为对象的方法调用. 2.作为普通函数的方法调用. 3.Function.prototype.c ...

  10. JS设计模式基础

    设计模式: 通过封装.继承.多态.组合等技术的反复使用,提炼出一些可重复使用的面向对象设计技巧. 1.多态(’做什么‘和’谁去做‘分开) 多态指同一个实体同时具有多种形式. 同一操作应用于不同的对象上 ...

随机推荐

  1. 最简单的视音频播放演示样例7:SDL2播放RGB/YUV

    ===================================================== 最简单的视音频播放演示样例系列文章列表: 最简单的视音频播放演示样例1:总述 最简单的视音频 ...

  2. 如何让图片开口说话 3DMeNow教程

    菜鸟玩3D--3DmeNow初级教程 3D软件对于我们这些菜鸟来说,一直是可望而不可及的一种东西,深奥的3D建模,复杂的面板操作--都使我们对之望而却步,有没有一种很简单的3D造型软件,使我们这些菜鸟 ...

  3. iOS常用的宏定义总结

    字符串是否为空 1   #define kStringIsEmpty(str) ([str isKindOfClass:[NSNull class]] || str == nil || [str le ...

  4. HDU 5323 SOLVE THIS INTERESTING PROBLEM 爆搜

    pid=5323" target="_blank" style="">链接 Solve this interesting problem Tim ...

  5. [bzoj3274]Circle

    https://www.zybuluo.com/ysner/note/1243396 题面 有\(n\)个排成一圈的格子,并且已知正整数\(k\)和\(m\),你需要往每个格子中填入一个大于等于\(k ...

  6. bzoj3662

    数学 其实我们发现不用每个数都去试一下,只要确定每个数字有几个就可以确定这个数.所以我们先搜索一下,然后检验. 但是这样太慢了,所以我们打表. 打出1-30的结果,然后取模. 打表的程序好像弄丢了.. ...

  7. App上架流程 & 上架被拒10大原因

    上架前预热 先登陆自己的开发者账号(自己提前注册好 iOS 开发者账号,这里假设你已经拥有了一个 iOS 开发者账号),进入这个页面:https://developer.apple.com/accou ...

  8. 02_jni_hello_c函数介绍

    介绍NDK平台都有哪些工具.通过NDK这套工具做安卓下的JNI开发. 可能有一些需求更适合通过C去做,有一些功能要通过C去实现.一个安卓程序,它本身还是一个Java应用.有一些功能/方法不通过Java ...

  9. c3p0-config.xml文件简单说明与备忘

    <?xml version="1.0" encoding="UTF-8"?> <c3p0-config> <named-confi ...

  10. input的type等于mage标签引发的页面提交!

    主要原因是使用了<input type="image",而且放在了<form中. <input type="image"标签类似<inp ...