资讯专栏INFORMATION COLUMN

Learning PHP —— 设计模式 | Chap1:浅谈设计模式中的OOP

SunZhaopeng / 2485人阅读

摘要:而哈士奇区别于普通狗,又有新的特征逗比,爱捣乱为了保证类之间的松绑定,通常会继承抽象类,而且是浅继承只有一层子类。如果知道所有类都会共享一个公共的行为实现,就使用抽象类,并在其中实现该行为。

为什么使用OOP

OOP是一个模块化的过程,目的是为了把复杂问题简单化,一个模块解决一个复杂问题的某一个方面,即一个类应当只有一个职责

OOP区别于顺序式编程与过程式编程,在于:

</>复制代码

  1. 1.顺序编程:用于处理最简单的问题
  2. 2.过程编程:将代码分为模块以便在程序中重用,程序猿输为一个函数
  3. 输入不同实参就能利用不同具体值使用函数
  4. 3.OOP:形同过程编程,长处在于能处理自己的数据结构,更方便地处理
  5. 独立但相互关联的类

从外部源启动PHP类,往往由其它模块调动,不会自启动,举个反例:

</>复制代码

OOP基本概念 抽象(abstract)

用于指示一个对象的基本特征,是处理复杂性的具体方法。
我们会对现实中的相似性分组,对具体的相似性抽象

举个例子:我们一般不会叫自己的爱宠哈士奇为"我的蠢萌蠢萌的、摇着尾巴的、爱捣乱的名叫Jeff的哈士奇",而往往会直接说:"我的狗!"

抽象类不能实例化,只能由具体类(可以实例化的类,非抽象类)继承抽象类的接口以及所有具体属性

所有类都是对数据的一组操作的抽象

基本语法:

</>复制代码

</>复制代码

接口(interface)

不能像抽象类那样在接口中包含具体方法或变量,除非是具有抽象性的接口,可以包含具体常量

接口的核心部分由类中操作(函数)定义的所有签名组成。签名包括一个操作的操作名和参数,一个接口表示的就是所有签名的集合。例如以下代码,签名由trick()和形参$whatever组成

</>复制代码

  1. public function trick($whatever){
  2. echo "signature";
  3. }

如果要实现接口(implements),就要保证实现接口中的所有方法,在此基础上可以再继续添加额外的方法

</>复制代码

</>复制代码

  1. ";
  2. }
  3. public function sendInfo(){
  4. return $Info;
  5. }
  6. public function calculate($first,$second){
  7. $calculate = $first * $second;
  8. return $calculate;
  9. }
  10. /******** 除此之外可以增加其他类 ********/
  11. public function useMethods(){
  12. $this->getInfo("习近平会见马英九");
  13. echo $this->sendInfo("恒大战平阿赫利") . "
    ";
  14. echo "Salary : $" . $this->calculate(20,15) ;
  15. }
  16. $worker = new ImplementAlpha;
  17. $worker->useMethods();
  18. //前面提到不要自启动,这里为了方便就直接自启动实例化类
  19. //不过可以看到,在实现类中,方法都是经过useMethods的方法调用的
  20. //在后面章你会看到很多例子都是这样实现的,而往往不会直接调用
  21. }
  22. ?>

OOP和设计模式有很多重要的结构要素,其中之一就是指定数据类型为接口而不是一个具体实现,对数据的引用要通过父类完成。如下所示:

</>复制代码

</>复制代码

</>复制代码

</>复制代码

  1. doInterface($apple);
  2. $this->doInterface($book);
  3. //实例化类在一个方法中,调用类的方法又在另一个方法中,降低了耦合度
  4. }
  5. function doInterface(IProduct $product){
  6. echo $product->apples();
  7. echo $product->books();
  8. }
  9. }
  10. $worker = new useProduct();
  11. ?>

这就是强制数据类型,其中使用的对象(类)必然有给定的接口,如果把一个接口 (一个对象类或者接口) 作为代码提示,绑定会更宽松)它会绑定到接口而不是绑定到一个特定的实现,如上面的doInterface(IProduct $product)

封装(Encapsulation)

封装是画份一个抽象的诸多元素的过程,这些元素构成该抽象的结构和行为,封装的作用就是将抽象的契约接口与其实现分离

通过3种类型的可见性保护封装(private/protected/public)。但是一个类还是要有可见方法访问封装,比如__consruct构造函数,默认为公共的

为了保持封装而又提供可访问性,OOP建议使用getter()和setter()方法,但是不能滥用,否则会破坏封装

</>复制代码

  1. setter(200);
  2. $got = $this->getter();
  3. echo $got;
  4. }
  5. private function getter(){
  6. return $this->data;
  7. }
  8. private function setter($setValue){
  9. $this->data = $setValue;
  10. }
  11. }
  12. $worker = new GetSet();
  13. ?>
继承(extends)

假设我有一只哈士奇(我们称之为子类),那么它继承了狗(父类)的属性,比如四只脚,看到的世界都是通过#404040层过滤的。而哈士奇区别于普通狗,又有新的特征:逗比,爱捣乱

为了保证类之间的松绑定,通常会继承抽象类,而且是浅继承(只有一层子类)。深继承的话,一旦对父类进行简单修改,子类会带来严重的破坏

</>复制代码

  1. $pet = $petChar;
  2. }
  3. }
  4. ?>

</>复制代码

  1. fourlegs() . "
    ";
  2. echo $this->character("They are crazy!") . "
    ";
  3. echo $this->naughty() . "
    ";
  4. }
  5. private function naughty(){
  6. return "Haski dogs are naughty";
  7. }
  8. }
  9. ?>

</>复制代码

多态(polymorphism)

多态的真正价值在于可以调用有相同接口的对象来完成不同的工作。一个大型项目中,增加和修改会对程序带来巨大影响,除非有一个公共的接口(父类或接口),例如:

</>复制代码

从上面的例子看出,Jet和Car类对接口的实现有很大不同。但是基于这样一个公共接口,在一个给定的程序结构中做出修改或者增补时,可以放心地请求或使用接口方法,而不必担心程序会崩溃

抽象还是接口

(引用于CSDN-PHP的抽象类、接口的区别)

如果要创建一个模型,这个模型将由一些紧密相关的对象采用,就可以使用抽象类。如果要创建将由一些不相关对象采用的功能,就使用接口。

如果必须从多个来源继承行为,就使用接口。

如果知道所有类都会共享一个公共的行为实现,就使用抽象类,并在其中实现该行为。


PS:该篇引用于《Learning PHP设计模式》第1、2章节

Chap2 预告 :设计模式与UML

算法处理操作速度,设计模式解决开发速度

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/21209.html

相关文章

  • 浅谈OOP Javascript [1]

    摘要:工厂模式优点集中实例化,可以传参等缺点分不清属于哪个对象我们先来谈谈优点,看例子集中实例化返回实例化对象返回返回不难看出,工厂模式比上面的例子减少了很多代码。 ECMAscript开发的两种模式:1.过程化 2.OOP(面向对象) 面向对象的语言有一个标志,那就是类的概念,而通过类可以创建任意多个具有相同属性的方法的对象。但是ECMAscript中没有类的概念! 又谈作用域 首先...

    xinhaip 评论0 收藏0
  • 浅谈OOP Javascript [2] -- 构造函数

    摘要:构造函数上一章我们讲了工厂模式,它的缺点就是无法识别到底哪个属于哪个的问题。我们可以用构造函数来解决这个识别问题。来比较构造函数内的值就可以看出到底是什么类型。 构造函数 上一章我们讲了工厂模式,它的缺点就是无法识别到底哪个属于哪个的问题。我们可以用构造函数来解决这个识别问题。 //构造函数 function Create(a,b) { this.a =a; this...

    didikee 评论0 收藏0
  • 浅谈 OOP JavaScript [3] -- 原型

    摘要:上一章我们谈了构造函数,他的唯一特点就是比较了地址不相同,因为大家知道引用类型是比较的引用。也就是说不用在构造函数中定义对象实例,而是直接将这些添加到原型当中。如果构造函数实例里面没有,就去原型里面查找,如果有就立即返回。 上一章我们谈了构造函数,他的唯一特点就是比较了地址不相同,因为大家知道引用类型是比较的引用。我们来谈谈原型。 原型 我们每创建一个函数都有一个原型(prototyp...

    SQC 评论0 收藏0
  • Chap4:创建型设计模式————原型设计模式

    摘要:原型设计模式中,原型设计模式的关键是要了解如何使用内置函数抽象原型角色声明一个克隆自身的接口具体原型角色实现一个克隆自身的操作原型设计模式的目的通过克隆以减少实例化对象的开销,与其实例化新对象,完全可以使用一个已有实例的克隆注意类是原型设计 原型设计模式 Notice: PHP中,原型设计模式的关键是要了解如何使用内置函数__clone() 抽象原型角色(Prototype):声明一...

    MiracleWong 评论0 收藏0
  • Learning PHP —— 设计模式 | Chap2:设计模式与UML

    摘要:设计模式设计模式基本原则设计原则按接口而不是按实现来编程按接口而不是按实现编程是指,要将变量设置为一个抽象类或接口数据类型的实例,而不是一个具体实现的实例。例如父类的一个改变会逐级向下传递给子类实现,这可能会影响子类使用的某个算法。 设计模式 设计模式基本原则 设计原则 ① : 按接口而不是按实现来编程 按接口而不是按实现编程是指,要将变量设置为一个抽象类或接口数据类型的实例,而不是一...

    senntyou 评论0 收藏0

发表评论

0条评论

SunZhaopeng

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<