PHP业务逻辑层和数据访问层设计
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业务逻辑层和数据访问层设计, 感谢原作者分享。

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

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

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

PHP 8.4 帶來了多項新功能、安全性改進和效能改進,同時棄用和刪除了大量功能。 本指南介紹如何在 Ubuntu、Debian 或其衍生版本上安裝 PHP 8.4 或升級到 PHP 8.4

Visual Studio Code,也稱為 VS Code,是一個免費的原始碼編輯器 - 或整合開發環境 (IDE) - 可用於所有主要作業系統。 VS Code 擁有大量針對多種程式語言的擴展,可以輕鬆編寫

JWT是一種基於JSON的開放標準,用於在各方之間安全地傳輸信息,主要用於身份驗證和信息交換。 1.JWT由Header、Payload和Signature三部分組成。 2.JWT的工作原理包括生成JWT、驗證JWT和解析Payload三個步驟。 3.在PHP中使用JWT進行身份驗證時,可以生成和驗證JWT,並在高級用法中包含用戶角色和權限信息。 4.常見錯誤包括簽名驗證失敗、令牌過期和Payload過大,調試技巧包括使用調試工具和日誌記錄。 5.性能優化和最佳實踐包括使用合適的簽名算法、合理設置有效期、

字符串是由字符組成的序列,包括字母、數字和符號。本教程將學習如何使用不同的方法在PHP中計算給定字符串中元音的數量。英語中的元音是a、e、i、o、u,它們可以是大寫或小寫。 什麼是元音? 元音是代表特定語音的字母字符。英語中共有五個元音,包括大寫和小寫: a, e, i, o, u 示例 1 輸入:字符串 = "Tutorialspoint" 輸出:6 解釋 字符串 "Tutorialspoint" 中的元音是 u、o、i、a、o、i。總共有 6 個元

本教程演示瞭如何使用PHP有效地處理XML文檔。 XML(可擴展的標記語言)是一種用於人類可讀性和機器解析的多功能文本標記語言。它通常用於數據存儲

靜態綁定(static::)在PHP中實現晚期靜態綁定(LSB),允許在靜態上下文中引用調用類而非定義類。 1)解析過程在運行時進行,2)在繼承關係中向上查找調用類,3)可能帶來性能開銷。

PHP的魔法方法有哪些? PHP的魔法方法包括:1.\_\_construct,用於初始化對象;2.\_\_destruct,用於清理資源;3.\_\_call,處理不存在的方法調用;4.\_\_get,實現動態屬性訪問;5.\_\_set,實現動態屬性設置。這些方法在特定情況下自動調用,提升代碼的靈活性和效率。
