资讯专栏INFORMATION COLUMN

PHP设计模式(三):封装

dongxiawu / 2375人阅读

摘要:原文地址设计模式三封装面向对象编程中,一切都是对象,对一个对象的封装,也成了面向对象编程中必不可少的部分。封装方法和别的程序设计语言一样,也只是三种封装概念,,。直接访问和修改破坏了类的封装性。

原文地址:PHP设计模式(三):封装

Introduction

面向对象编程中,一切都是对象,对一个对象的封装,也成了面向对象编程中必不可少的部分。
和C/C++,Java,Python等语言一样,PHP也支持封装。

封装/Encapsulation

对事物的封装是指,将事物进行抽象后,提供抽象概念的实现的具体方法。

听起来很拗口,还是举鲸鱼的例子。
对于鲸鱼来说,需要吃东西这个行为,吃本身是一个抽象的概念,因为具体到怎么吃,是咀嚼和消化的过程,甚至如何咀嚼和消化也是不可见的。对外部而言,可见的只是吃这一个接口,如何吃、怎么吃,是被封装在了鲸鱼的实现中。
甚至可以说,消化系统,被封装到了鲸鱼这个对象中,对外部不可见,仅仅鲸鱼自己可见。

封装方法

和别的程序设计语言一样,PHP也只是三种封装概念:Private,Protected,Public。

私有/Private

私有的概念是,仅仅对象内部可见,外部不可见,如:

name = "Whale";
  }
  public function eat($food) {
    chew($food);
    digest($food);
  }
  private function chew($food) {
    echo "Chewing " . $food . "
";
  }
  private function digest($food) {
    echo "Digest " . $food . "
";
  }
}
?>

name是鲸鱼的私有属性,chew()和digest()是鲸鱼的私有方法,对于其他类来说,都是不可见的。对于现实来说,我们如果只是注重吃,并没有必要去关心鲸鱼是如何去吃的。

保护/Protected

保护的概念是,仅仅是自身类和继承类可见,这个关键字的用途主要是防止滥用类的派生,另外三方库编写的时候会用到,防止误用。

name = "Whale";
  }
  public function eat($food) {
    chew($food);
    digest($food);
  }
}
?>

鲸鱼类可以通过继承使用动物类的咀嚼和消化方法,但是别的继承鲸鱼类的类就不可以再使用动物类的咀嚼和消化方法了。保护更多是用于面向对象设计,而不是为了编程来实现某个需求。

公共/Public

公共的概念就是,任何类、任何事物都可以访问,没有任何限制,这里不再赘述。

Getters/Setters

Getters和Setters也叫Accessors和Mutators,在Java/C#等语言中常以get()/set()方法出现。
对于这两个东西的争议很大,考虑下面一个类:

如果不使用Getters/Setters,我们给Price类赋值和取值一般是这样:

priceA = 1;
  $price->priceB = 2;
  $price->priceC = 3;
  ...
  echo $price->priceA;
  echo $price->priceB;
  echo $price->priceC;
  ...
?>

但是如果使用了Getters/Setters,Price类将变成这样:

priceA;
  }
  public function setPriceA($price) {
    $this->priceA = $price;
  }
  ...
}
?>

这时候赋值将变成这样:

setpriceA(1);
  $price->setPriceB(2);
  $price->setPriceC(3);
  ...
  echo $price->getPriceA();
  echo $price->getPriceB();
  echo $price->getPriceC();
  ...
?>

是不是感觉需要多敲很多代码?这也是很多程序员不愿意使用get/set的原因,造成了大量的看似无用冗余的代码。
为什么叫看似冗余和无用?因为Getters/Setters是编程设计方法,而不是编程实现方法。

在面向对象程序设计中,类和类之间的访问、交互和更新应该是通过Accessors和Mutators,也就是Getters和Setters来实现。直接访问和修改破坏了类的封装性。

为什么采用这种设计方式?因为程序设计是对现实问题的抽象,而在编程的工程中程序员扮演的角色往往是上帝。
考虑这样一种场景:你朋友要求你改名,决定是否改名的人是你,而不是你朋友。在你的朋友的视觉(也就是你朋友的类),他不能直接去修改你的名字。
如果你直接采用非Getters/Setters的设计方法,事实上是程序员扮演的这个上帝修改了现实规则,允许你朋友能够随意更改你的姓名,显然这是不合理的。

Summary

合理的封装对于好的程序设计是必不可少的,虽然什么都是Public也能解决编程问题,但是这不是用程序设计解决问题的思路。

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

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

相关文章

  • PHP面试之面向对象(1)

    摘要:二面向对象有什么特征面向对象的主要特征有抽象继承封装和多态。析构函数析构函数是在引入的,它的作用与调用时机和构造函数刚好相反,它在对象被销毁时自动执行。 PHP面试专栏正式起更,每周一、三、五更新,提供最好最优质的PHP面试内容。PHP中面向对象常考的知识点有以下7点,我将会从以下几点进行详细介绍说明,帮助你更好的应对PHP面试常考的面向对象相关的知识点和考题。整个面向对象文章的结构涉...

    phodal 评论0 收藏0
  • 基于 Laravel Route 的 社交系统ThinkSNS+ Component【研发日记系列

    摘要:在社交系统中有这样一个命令主要是用作包的安装,升级,卸载。这在开发过程中很有用。内测申请方式提供个人企业联系方式及认证信息实名企业营业执照照片或扫描件及申请说明,发送邮件至将有机会获得首批内测资格,名额有限,申请从速。 在前面,我介绍了拓展类型,分别有 plus-compnent 和 plus-plugin 两个,这里重点讲以下如何实现 plus-component 的。 plus-c...

    pf_miles 评论0 收藏0
  • 各开源框架使用与设计总结(

    摘要:总结了框架与架构的区别。站在框架之外,看框架,看框架的共同特征与功用。由于框架所带来的问题,以性能可扩展问题,相对严重,所以分析性能的改造方向,总结了六大点。包括框架介绍,的使用,以及。 六、各项实践,性能评测 下面进入性能评测,评测我们相对就比较快速一些。直接用ab命令,来测试上面的所提及的一些改进。 以下评测,所有测试页面,均为:http://hjvote.app.ucai.cn/...

    objc94 评论0 收藏0
  • PHP设计模式(二)工厂方法模式(Factory Method)

    摘要:对于这个问题,接下来的工厂方法模式可以解决这个问题。二工厂方法模式的优点拥有良好的封装性,代码结构清晰。参考系列源地址系列目录设计模式概述设计模式一简单工厂模式设计模式二工厂方法模式设计模式三抽象工厂模式设计模式四单例模式 简单工厂简述: 简单工厂模式实现了产品类的代码跟客户端代码分离,但会有一个问题,优秀的代码是符合开闭原则如果你要加一个C类产品,你就要修改工厂类里面的代码,也就是说...

    zhjx922 评论0 收藏0
  • polarphp:一个新的 PHP 语言运行时环境

    摘要:项目介绍是一个全新的语言的运行时环境,基于目前最新的进行打造,支持最新的语言规范,同时提供了自己的运行时标准库。同样也在的基础上进行打造,实现了一个除开发之外的一个全新的运行环境。发布核心虚拟机的镜像。整合运行时框架。 showImg(https://segmentfault.com/img/bVbnQXK); polarphp 项目介绍 polarphp是一个全新的PHP语言的运行时...

    宋华 评论0 收藏0

发表评论

0条评论

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