1、面向对象能给我们什么? 进行分析之前,我们先来复习一下面向对象。 对象 是要进行研究的任何事物。 类 是具有相同或相似性质的对象的抽象。 面向对象的要素:封装、继承、多态。 面向对象目的是:如何分配职责 。 面向对象设计原则 : 单一职责原则 (SRP
1、面向对象能给我们什么?
进行分析之前,我们先来复习一下面向对象。
对象是要进行研究的任何事物。
类是具有相同或相似性质的对象的抽象。
面向对象的要素:封装、继承、多态。
面向对象目的是:如何分配职责。
面向对象设计原则:
- 单一职责原则 (SRP) 一个类,只有一个引起它变化的原因。
- 开放-封闭原则 (OCP)(对外)可扩展,(对内)不可修改。
- 李氏替换原则 (LSP) 子类型必须能够完全替换其父类型。
- 依赖倒置原则 (DIP) 要依赖于抽象,不要依赖于具体。
- 接口隔离原则 (ISP) 使用多个专门的接口比使用单一的总接口好;
- 合成/聚合复用原则 (Composite/Aggregate Reuse Principle,CARP)在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分;新的对象通过向这些对的委派达到复用已有功能的目的。
- 最小知识原则(Principle of Least Knowledge,PLK,也叫迪米特法则)不要和陌生人说话。
2、业务逻辑层
在web应用中,我们通常使用MVC分层架构模式来将职责分离。
MVC模式的目的是实现一种动态的程序设计,使后续对程序的修改和扩展简化,并且使程序某一部分的重复利用成为可能。除此之外,此模式通过对复杂度的简化,使程序结构更加直观。软件系统通过对自身基本部份分离的同时也赋予了各个基本部分应有的功能。
- 控制器(Controller)- 负责转发请求,对请求进行处理。
- 视图(View) – 界面设计人员进行图形界面设计。
- 模型(Model) – 用于封装与应用程序的业务逻辑相关的数据(属性)以及对数据的处理方法(行为)。
按照这样的定义,模型是传说中的领域模型的实现类,实现业务逻辑,但数据访问层是不属于模型的。
我们MVC中的模型可以定义为领域逻辑。
领域逻辑有多中架构模式,如:
事务脚本: 使用过程来设计业务逻辑,每个过程处理来自表现层的单个请求。
领域模型: 合并了行为和数据(属性)的领域对象模型。
表模块: 处理某一数据库表或视图中所有行的业务逻辑的一个实例。
服务层: 通过一个服务来定义应用程序边界,在服务层中建立一组可用的操作集合,并在每个操作内部协调应用程序的响应。
表模块模型是把领域模型和数据访问合并起来了。
事务脚本是面向过程的,不利于分配职责。
服务层是在领域模型上一层,引入服务层的话系统就复杂很多了。
如果项目相对较小,业务逻辑很简单,也是用一种固定的数据库(如MySQL),就不需要分业务逻辑层和数据访问层,可以选择表模块模式组织领域逻辑。
如果项目的功能会随着时间越来越多,需求不好控制,我们需要更多的考虑到减少依赖和明确职责,这样我们使用领域模型的领域逻辑架构模式来作为MVC中的M层,对对象的属性和行为进行描述,另外添加一个数据访问层给业务逻辑提供数据。
3、数据访问层
在martin fowler的《企业应用架构模式》介绍了4种数据源架构模式:表数据入口、行数据入口、活动记录、数据映射器。此外还有ResultSet、 Metadata等模式。
(1)表数据入口(Table Data Gateway):充当数据库表访问入口的对象。一个实例处理表中所有的行。
(2)行数据入口(Row Data Gateway):充当数据源中单条记录入口的对象。每行一个实例。
(3)活动记录(Active Record):一个对象,它包装数据库表或视图中某一行,封装数据库访问,并在这些 数据上增加了领域逻辑。
(4)数据映射器(Data Mapper):在保持对象和数据库彼此独立的情况下在二者之间移动数据的一个映射器层。它能够在内存对象和数据库中传递数据并保持他们彼此独立,以分离领域与数据源。
活动记录集可以使用在不分业务逻辑层和数据访问层的情况。
最理想的情况下是使用数据映射器模式,使用ORM层,业务逻辑层只出力领域中的行为,增加VO模型对对象的属性进行描述和validate,通过DAO访问数据库。这样就能彻底的面向对象了,在业务逻辑、数据访问、视图中都直接操作直观的VO模型类。但是回到现实中,我们发现这样做起来把事情复杂化了。
我们PHP程序员对SQL语句就像是C/C++程序员离不开指针一样,使用sql语句非常灵活,更利于性能优化。绝大多数情况下,我们的系统用什么数据库都是预先定好了的,转移的可能性非常少。而且我们用面向对象分析的时候,只分析到业务逻辑层(领域模型)。我们只用kv数组/对象替代VO对象在PHP中不论是数据存贮还是数据分析和处理,都更灵活。因此,由语言本身决定,表数据入扣模式更适合做PHP的数据访问层。
综上,我们MVC中的模型是对领域对象模型的实现,对业务对象的属性和行为负责,组成业务逻辑层,通过表数据入口模式对业务逻辑层进行支持。
原文地址:PHP业务逻辑层和数据访问层设计, 感谢原作者分享。

php把负数转为正整数的方法:1、使用abs()函数将负数转为正数,使用intval()函数对正数取整,转为正整数,语法“intval(abs($number))”;2、利用“~”位运算符将负数取反加一,语法“~$number + 1”。

实现方法:1、使用“sleep(延迟秒数)”语句,可延迟执行函数若干秒;2、使用“time_nanosleep(延迟秒数,延迟纳秒数)”语句,可延迟执行函数若干秒和纳秒;3、使用“time_sleep_until(time()+7)”语句。

php字符串有下标。在PHP中,下标不仅可以应用于数组和对象,还可应用于字符串,利用字符串的下标和中括号“[]”可以访问指定索引位置的字符,并对该字符进行读写,语法“字符串名[下标值]”;字符串的下标值(索引值)只能是整数类型,起始值为0。

php除以100保留两位小数的方法:1、利用“/”运算符进行除法运算,语法“数值 / 100”;2、使用“number_format(除法结果, 2)”或“sprintf("%.2f",除法结果)”语句进行四舍五入的处理值,并保留两位小数。

在php中,可以使用substr()函数来读取字符串后几个字符,只需要将该函数的第二个参数设置为负值,第三个参数省略即可;语法为“substr(字符串,-n)”,表示读取从字符串结尾处向前数第n个字符开始,直到字符串结尾的全部字符。

判断方法:1、使用“strtotime("年-月-日")”语句将给定的年月日转换为时间戳格式;2、用“date("z",时间戳)+1”语句计算指定时间戳是一年的第几天。date()返回的天数是从0开始计算的,因此真实天数需要在此基础上加1。

查找方法:1、用strpos(),语法“strpos("字符串值","查找子串")+1”;2、用stripos(),语法“strpos("字符串值","查找子串")+1”。因为字符串是从0开始计数的,因此两个函数获取的位置需要进行加1处理。

方法:1、用“str_replace(" ","其他字符",$str)”语句,可将nbsp符替换为其他字符;2、用“preg_replace("/(\s|\ \;||\xc2\xa0)/","其他字符",$str)”语句。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

SublimeText3汉化版
中文版,非常好用

DVWA
Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中

VSCode Windows 64位 下载
微软推出的免费、功能强大的一款IDE编辑器

SublimeText3 英文版
推荐:为Win版本,支持代码提示!

适用于 Eclipse 的 SAP NetWeaver 服务器适配器
将Eclipse与SAP NetWeaver应用服务器集成。