第六节:php面向对象编程单一功能原则

PHP面向对象编程基础

单一功能原则,在面向对象编程领域中,单一功能原则(Single responsibility principle)规定每个类都应该有一个单一的功能,并且该功能应该由这个类完全封装起来。所有它的(这个类的)服务都应该严密的和该功能平行(功能平行,意味着没有依赖)。

把前面课堂源码改为单一功能原则思路

这节课按照单一功能原则,每个类负责一个单一的功能,把类完全封装起来,从程序中把其余部分代码分离出来。在这个user class,显然它的唯一功能应该是为用户保存数据,但现在它有多重功能。例如,这个类也负责验证。

我们代码对电子邮件进行硬编码验证方法,现在带来了一些实际问题,首先验证与user class没有紧密的联系,其次我们不能在程序的其它地方中重复使用这个验证方法。现在让我们想一想,这个验证方法放在user类中是个好主意吗?如果我们想要检查一个有效的电子邮件比如我们的联系表单?如果我们的user类真的负责验证,或者我们可以提取出来,创建一些验证服务。

如果用户类是关于存储用户数据,我们是否真的需要一个登录和一个注销方法?或者我们应该创建一个专门用于登录和注销的认证服务。哈希?user类是我们应用程序中唯一需要哈希的地方,如果不是的话,那为什么要在我们的user类中呢?

上述这些考虑都与单一功能原则有关,现在按照单一功能原则,每个类都要有一个单一的功能,实际的功能应该完全由类来包装。好的,现在让我们来改进,让我们先重构应用程序的结构,创建一个app的文件夹,然后我会将user类并将其移到该文件夹内,把user.php的文件名修改User.php,在app文件夹创建一个新类叫Validator.php,专门用来验证,又创建Helper.php。

单一功能原则-php面向对象编程单实例演示

单一功能原则-php面向对象编程单实例演示

单一功能原则-php面向对象编程单实例演示

打开Validator.php,让我们为我们的验证类创建一个非常简单的验证服务,首先我们需要存储错误,默认情况下是一个空的数组,我们把它创建为私有:

回到validation方法,现在需要两个参数,第一个将会是一个数组,这个将称为数组($data),它将包含我们要验证的数据,第二个是一个数组,将被称为规则($rules):

检查上述代码是否工作让我们回到index.php:

返回浏览器刷新index.php页面显示空白。

让我们回到Validator.php开始设置validation规则:

如我们非常想知道validation返回false或true,我们可以在index.php这样来操作:

返回浏览器刷新index.php页面显示string(6) “通过”。让我们删除邮箱地址和密码,测试结果:array(2) { [“email”]=> array(1) { [0]=> string(20) “这个email必填项” } [“password”]=> array(1) { [0]=> string(23) “这个password必填项” } }

如果我们设置无效的邮箱地址和无效的密码呢,让我们开始做邮箱和密码验证:

返回index.php测试显示结果:

让我们整理User.php的代码,把validate从user类移除,删除minchars常量,设置电子邮箱地址,删除validation方法:

回到index.php,如果通过validation输出电子邮箱和密码,否则就返回错误信息:

接下来我们要做的是密码加密,在我们的Helper.php文件里面,我们将创建一个getHash方法:

回到index.php把hash添加上去

返回index.php显示结果:

让我们回头看

  1. Validate类只负责验证,这些类可以重复性一次又一次是使用;
  2. User类只负责建立一个用户,并登录和注销;
  3. Helper类负责做简单的事情,像创建一个hash。

下载本课堂完整源码

接近10年的互联网从业经验,精通Scrum敏捷软件开发的方法,从事互联网产品设计,开发,测试,运营,案例不少于20个,发现自己最喜欢的工作是做外贸营销,外贸SEO,特别喜欢谷歌优化。从2017年3月开始坚持在群161510483直播谷歌SEO和WEB前端开发技术,只要加进来坚持学习零基础也能够学会。

Last modified: 2019年1月17日

Previous Story

PHP面向对象编程基础

第五节:PHP对象复制

PHP对象复制:从一个类创建一个对象并复制它几次可能是有用的,对象是通过引用而不是按值复制的,但这到底意味着什么呢?

...

Next Story

PHP面向对象编程基础

第七节:PHP魔术方法

PHP魔术方法:每个类都充满了“魔法”等待着他们释放魔法的力量,首先让我们看user类,现在魔术方法被无形地调用,导致我们经常忘记它们存在,但他们确实存在于那里.

...