单一功能原则,在面向对象编程领域中,单一功能原则(Single responsibility principle)规定每个类都应该有一个单一的功能,并且该功能应该由这个类完全封装起来。所有它的(这个类的)服务都应该严密的和该功能平行(功能平行,意味着没有依赖)。
把前面课堂源码改为单一功能原则思路
这节课按照单一功能原则,每个类负责一个单一的功能,把类完全封装起来,从程序中把其余部分代码分离出来。在这个user class,显然它的唯一功能应该是为用户保存数据,但现在它有多重功能。例如,这个类也负责验证。
我们代码对电子邮件进行硬编码验证方法,现在带来了一些实际问题,首先验证与user class没有紧密的联系,其次我们不能在程序的其它地方中重复使用这个验证方法。现在让我们想一想,这个验证方法放在user类中是个好主意吗?如果我们想要检查一个有效的电子邮件比如我们的联系表单?如果我们的user类真的负责验证,或者我们可以提取出来,创建一些验证服务。
如果用户类是关于存储用户数据,我们是否真的需要一个登录和一个注销方法?或者我们应该创建一个专门用于登录和注销的认证服务。哈希?user类是我们应用程序中唯一需要哈希的地方,如果不是的话,那为什么要在我们的user类中呢?
上述这些考虑都与单一功能原则有关,现在按照单一功能原则,每个类都要有一个单一的功能,实际的功能应该完全由类来包装。好的,现在让我们来改进,让我们先重构应用程序的结构,创建一个app的文件夹,然后我会将user类并将其移到该文件夹内,把user.php的文件名修改User.php,在app文件夹创建一个新类叫Validator.php,专门用来验证,又创建Helper.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显示结果:
让我们回头看
- Validate类只负责验证,这些类可以重复性一次又一次是使用;
- User类只负责建立一个用户,并登录和注销;
- Helper类负责做简单的事情,像创建一个hash。
转载请注明:林雍岷 » 第六节:php面向对象编程单一功能原则