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 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











PHP 8.4는 상당한 양의 기능 중단 및 제거를 통해 몇 가지 새로운 기능, 보안 개선 및 성능 개선을 제공합니다. 이 가이드에서는 Ubuntu, Debian 또는 해당 파생 제품에서 PHP 8.4를 설치하거나 PHP 8.4로 업그레이드하는 방법을 설명합니다.

숙련된 PHP 개발자라면 이미 그런 일을 해왔다는 느낌을 받을 것입니다. 귀하는 상당한 수의 애플리케이션을 개발하고, 수백만 줄의 코드를 디버깅하고, 여러 스크립트를 수정하여 작업을 수행했습니다.

VS Code라고도 알려진 Visual Studio Code는 모든 주요 운영 체제에서 사용할 수 있는 무료 소스 코드 편집기 또는 통합 개발 환경(IDE)입니다. 다양한 프로그래밍 언어에 대한 대규모 확장 모음을 통해 VS Code는

JWT는 주로 신분증 인증 및 정보 교환을 위해 당사자간에 정보를 안전하게 전송하는 데 사용되는 JSON을 기반으로 한 개방형 표준입니다. 1. JWT는 헤더, 페이로드 및 서명의 세 부분으로 구성됩니다. 2. JWT의 작업 원칙에는 세 가지 단계가 포함됩니다. JWT 생성, JWT 확인 및 Parsing Payload. 3. PHP에서 인증에 JWT를 사용하면 JWT를 생성하고 확인할 수 있으며 사용자 역할 및 권한 정보가 고급 사용에 포함될 수 있습니다. 4. 일반적인 오류에는 서명 검증 실패, 토큰 만료 및 대형 페이로드가 포함됩니다. 디버깅 기술에는 디버깅 도구 및 로깅 사용이 포함됩니다. 5. 성능 최적화 및 모범 사례에는 적절한 시그니처 알고리즘 사용, 타당성 기간 설정 합리적,

이 튜토리얼은 PHP를 사용하여 XML 문서를 효율적으로 처리하는 방법을 보여줍니다. XML (Extensible Markup Language)은 인간의 가독성과 기계 구문 분석을 위해 설계된 다목적 텍스트 기반 마크 업 언어입니다. 일반적으로 데이터 저장 AN에 사용됩니다

문자열은 문자, 숫자 및 기호를 포함하여 일련의 문자입니다. 이 튜토리얼은 다른 방법을 사용하여 PHP의 주어진 문자열의 모음 수를 계산하는 방법을 배웁니다. 영어의 모음은 A, E, I, O, U이며 대문자 또는 소문자 일 수 있습니다. 모음이란 무엇입니까? 모음은 특정 발음을 나타내는 알파벳 문자입니다. 대문자와 소문자를 포함하여 영어에는 5 개의 모음이 있습니다. a, e, i, o, u 예 1 입력 : String = "Tutorialspoint" 출력 : 6 설명하다 문자열의 "Tutorialspoint"의 모음은 u, o, i, a, o, i입니다. 총 6 개의 위안이 있습니다

정적 바인딩 (정적 : :)는 PHP에서 늦은 정적 바인딩 (LSB)을 구현하여 클래스를 정의하는 대신 정적 컨텍스트에서 호출 클래스를 참조 할 수 있습니다. 1) 구문 분석 프로세스는 런타임에 수행됩니다. 2) 상속 관계에서 통화 클래스를 찾아보십시오. 3) 성능 오버 헤드를 가져올 수 있습니다.

PHP의 마법 방법은 무엇입니까? PHP의 마법 방법은 다음과 같습니다. 1. \ _ \ _ Construct, 객체를 초기화하는 데 사용됩니다. 2. \ _ \ _ 파괴, 자원을 정리하는 데 사용됩니다. 3. \ _ \ _ 호출, 존재하지 않는 메소드 호출을 처리하십시오. 4. \ _ \ _ get, 동적 속성 액세스를 구현하십시오. 5. \ _ \ _ Set, 동적 속성 설정을 구현하십시오. 이러한 방법은 특정 상황에서 자동으로 호출되어 코드 유연성과 효율성을 향상시킵니다.
