php程序设计的基本原则
- 单一职责原则(SRP):一个类应该只有一个原因引起变化,即一个类应该只负责一项职责。
class User {private $name;private $email;public function __construct($name, $email) {$this->name = $name;$this->email = $email;}public function getName() {return $this->name;}public function getEmail() {return $this->email;}
}
- 开放封闭原则(OCP):软件实体(类、模块、函数等等)应该对扩展开放,对修改封闭。
interface Shape {public function area();
}class Rectangle implements Shape {private $width;private $height;public function __construct($width, $height) {$this->width = $width;$this->height = $height;}public function area() {return $this->width * $this->height;}
}
- 里氏替换原则(LSP):子类型必须能够替换掉它们的基类型。
class Bird {public function fly() {echo "I can fly.";}
}class Penguin extends Bird {public function swim() {echo "I can swim.";}
}$penguin = new Penguin();
$penguin->fly(); // I can fly.
$penguin->swim(); // I can swim.
- 接口隔离原则(ISP):不应该强迫客户端实现它们不需要的接口。
interface Flyable {public function fly();
}interface Swimmable {public function swim();
}class Bird implements Flyable, Swimmable {public function fly() {echo "I can fly.";}public function swim() {echo "I can swim.";}
}
- 依赖倒置原则(DIP):高层模块不应该依赖于低层模块,它们都应该依赖于抽象。抽象不应该依赖于细节,细节应该依赖于抽象。
abstract class Animal {protected $name;public function __construct($name) {$this->name = $name;}public function getName() {return $this->name;}
}class Dog extends Animal {public function bark() {echo "Woof!";}
}
- 合成/复用原则(CAR):要尽量使用合成/复用代码,而不是重新编写代码。
class Math {public function add($a, $b) {return $a + $b;}public function subtract($a, $b) {return $a - $b;}public function multiply($a, $b) {return $a * $b;}public function divide($a, $b) {if ($b == 0) {throw new Exception("Division by zero");}return $a / $b;}
}$math = new Math();
echo $math->add(1, 2); // 3
echo $math->subtract(5, 3); // 2
echo $math->multiply(2, 3); // 6
echo $math->divide(6, 2); // 3
- 最小知识原则(LKP):一个对象应该只和它周围的世界发生耦合,而不应该与外部世界发生太多的交互。
class User {private $name;private $age;public function __construct($name, $age) {$this->name = $name;$this->age = $age;}public function getName() {return $this->name;}public function getAge() {return $this->age;}
}class Order {private $user;private $items;public function __construct(User $user, array $items) {$this->user = $user;$this->items = $items;}public function getUser() {return $this->user;}public function getItems() {return $this->items;}
}
php controller services dao logic model 是怎么交互的怎么个职责
在一个典型的PHP应用中,通常会采用MVC(Model-View-Controller)的设计模式来组织代码。在这种模式下,Controller、Service、DAO(Data Access Object)、Logic和Model各自承担不同的责任:
-
Model:
- Model 代表了应用程序的数据结构。它通常包含了与数据相关的业务逻辑、数据的访问、以及持久化等。
- 在一个PHP应用中,Model通常指代数据对象,比如一个数据库表对应的模型,或者其他数据实体。
- Model 负责与数据库交互,进行数据的读取、写入、更新等操作。
-
DAO (Data Access Object):
- DAO 是用来与数据源进行交互的一个层。它提供了一个抽象接口,使得应用程序可以独立于具体的数据存储方式(比如数据库)。
- DAO 负责处理底层的数据库操作,包括连接数据库、执行SQL查询等。
- DAO 将数据库返回的数据转化为适合应用程序使用的数据格式,通常是Model。
-
Logic:
- Logic 层是业务逻辑的处理部分,它包含了应用程序的主要业务逻辑。
- Logic 层不应该直接与数据库交互,而是通过调用Service来实现业务需求。
-
Service:
- Service 提供了一个高级的接口,用于实现特定的业务逻辑。
- Service 层负责协调多个Model和DAO,实现复杂的业务逻辑,同时也是Controller和Model之间的桥梁。
- Service 可以调用多个DAO来获取数据,也可以对数据进行处理后返回给Controller。
-
Controller:
- Controller 接收来自用户的请求,并决定如何响应。它是用户与应用程序之间的接口。
- Controller 负责调用适当的Service来处理业务逻辑,并将结果返回给View或者前端。
交互流程:
-
Controller调用Service:
- Controller 接收到用户的请求后,根据请求的内容调用相应的Service。
- Service 接收到请求后,会根据业务逻辑调用相应的DAO或者Logic来完成具体的任务。
-
Service协调Model和DAO:
- Service 可以调用多个Model和DAO来满足业务需求。
- Service 可以处理Model之间的关系,进行数据的组合或拆分。
-
DAO与数据库交互:
- DAO 负责与数据库进行交互,执行SQL查询,返回结果给Service。
-
Logic处理业务逻辑:
- Logic 负责处理复杂的业务逻辑,它可能需要对多个Model进行操作,以实现特定的业务需求。
-
Model处理数据:
- Model 负责与数据相关的逻辑,可能包括数据的验证、转换、持久化等。
-
结果返回给Controller:
- 最终结果会从Service返回给Controller,然后Controller可以将结果展示给用户,或者进行其他处理。
总的来说,各层之间的交互是有层次关系的,Controller是接收用户请求的入口,Service是处理业务逻辑的核心,DAO负责数据库交互,Logic处理业务逻辑的具体细节,Model负责数据的处理。它们共同协作,使得应用程序可以有组织、高效地处理业务需求。
相关文章:
php程序设计的基本原则
单一职责原则(SRP):一个类应该只有一个原因引起变化,即一个类应该只负责一项职责。 class User {private $name;private $email;public function __construct($name, $email) {$this->name $name;$this->email $email;}p…...
python execute() 使用%s 拼接sql 避免sql注入攻击 好于.format
1 execute(参数一:sql 语句) # 锁定当前查询结果行 cursor.execute("SELECT high, low, vol FROM table_name WHERE symbol %s FOR UPDATE;"% (symbol,)) 2 .format() cursor.execute("SELECT high, low, vol FROM table_name WHERE symbol {} FOR UPDATE;…...
RPC项目解析(1)
分布式通信框架:让远程方法调用和调用进程内方法一样简单 RPC通信原理 rpc:远程过程调用(远程能够调用其他模块的方法) 在rpc中需要发送时候,对发送的信息进行序列化,在服务端对接收到的信息进行反序列化…...
点云从入门到精通技术详解100篇-基于 RGB 图像与点云融合的三维点云分割算法及成像系统
目录 前言 相机和激光雷达标定研究现状 点云分割算法研究现状...
JDK8新特性
Lembda表达式 lembda表达式是一个简洁、可传递的匿名函数,实现了把代码块赋值给一个变量的功能 是我认为jdk1.8中最让人眼前一亮的特性(我没用过其他函数式的语言) 在了解表达式之前,我们先看两个概念 函数式接口 含有且仅含有一个抽象方法&…...
X86_64函数调用汇编程序分(2)
X86_64函数调用汇编程序分(2) 1 X86_64寄存器使用标准2 leaveq和retq指令2.1 leaveq2.2 retq 3 执行leaveq和retq之后栈的结构3.1 执行leaveq之后栈的结构3.1.1 test_fun_b函数执行leaveq之前的栈结构示意图3.1.2 test_fun_b函数执行leaveq之后的栈结构示…...
组件传值之ref(解决父传子动态绑定问题)
在父组件往子组件传值,子组件中要显示父组件的信息,首先是在网上搜的watch 来监听组组件的props,但是父组件只传一次,后续再更改就没了,所以我用的$refs props:{params:{type:Object;defult():{return {} } } }watch:{params: {/…...
vscode-server
1know_host清除 2 删除服务器里的home/user/.vscode-server(不是根root下的vscode-server),删除时用户名保持一致。 3 ssh配置文件 /etc/ssh/sshd_config[想改变,使用root,修改文件权限] 4 删除修改后,重启Windows下…...
ubuntu 20.04安装开发环境总结_安装python
Ubuntu 20.04 是一款主要面向开发人员的操作系统之一,与此同时,它还支持多种开发环境和工具的使用。但是因为对市面上各种软件的支持没有window那样友好,所以对ubuntu系统安装配置各种环境的问题做了个总结 安装 PyCharm: 可以从…...
尚硅谷_宋红康_IntelliJ IDEA 常用快捷键一览表
1-IDEA的日常快捷键 第1组:通用型 说明快捷键复制代码-copyctrl c粘贴-pastectrl v剪切-cutctrl x撤销-undoctrl z反撤销-redoctrl shift z保存-save allctrl s全选-select allctrl a 第2组:提高编写速度(上) 说明快捷…...
Java设计模式之建造者模式详解(Builder Pattern)
在日常的开发工作中,我们常常需要创建一些复杂的对象。这些对象可能包含许多不同的属性,并且这些属性的初始化过程可能相当复杂。在这种情况下,建造者模式是一种非常有用的设计模式,因为它允许我们分步骤地创建复杂的对象。 概念和…...
TCP的滑动窗口与拥塞控制
客户端每发送的一个包,服务器端都应该有个回复,如果服务器端超过一定的时间没有回复,客户端就会重新发送这个包,直到有回复。 为了保证顺序性,每一个包都有一个 ID。在建立连接的时候,会商定起始的 ID 是什…...
MySQL更新语句执行过程
执行流程 update t set name XXX where id 1; 加载id1的记录所在的整页数据到缓存池;旧值写入undolog便于回滚;更新内存数据;写redo log到RedoBuff;redo log顺序写入磁盘,准备提交事务(prepare阶段&…...
Matlab图像处理-彩色图像基础
彩色的物理认识 人类能够感知的物体的颜色是由物体反射的光的性质决定的。如图8-2所示,可见光是由电磁波谱中较窄的波段组成。 如果物体反射的光在所有可见光波长范围内都是平衡的,那么从观察者的角度来看,它是白色的; 如果物体…...
MATLAB算法实战应用案例精讲-【数模应用】数据中台
目录 前言 几个高频面试题目 数据中台、数仓、大数据平台的区别 1)数据中台VS数据仓库...
el-form动态检验无法生效问题(已解决)
要对el-form里面的字段动态生成校验规则,测试了一系列的骚操作也无法生效,要么是require视图生效了,校验规则还是不生效;看了csdn里面好多方案,都是废话,废话,直接上硬货,最终总结如下ÿ…...
【python】代码学习过程问题总结
目录 1. 使用 conda 创建并进入虚拟环境 2. pycharm 选择 interpreter 的时候,在虚拟环境中找不到 python.exe 3.(py & python)ModuleNotFoundError: No module named XXX 4. AttributeError: module ‘tensorflow‘ has no attribu…...
Qt应用开发(基础篇)——菜单 QMenu
一、前言 QMenu类继承于QWidget,它提供了一个菜单样式的小部件,用于菜单栏、上下文菜单和一些弹出式菜单。 QMenu菜单的选项是可选的,它可以是一个下拉的菜单,也可以是独立的上下文菜单。下拉菜单通常作用于当用户单击相应的项目或…...
MySQL-DDL语句
MySQL-DDL语句 数据库操作语句增删数据库查看数据库列表创建数据库进入(使用)数据库/查看当前所在的数据库查看数据库的建库语句查看数据库的编码集和校验集删除数据库修改数据库的编码集查看数据库支持的编码集和校验集 数据库备份备份单个数据库恢复数…...
总结987
考研倒计时102天 时间记录: 6:20起床 7:00~7:40早读,13年tex2 7:50~8:20实验室 8:30~8:34列日计划 8:40~11:18进步本回顾,记录 11:20~12:20计算机网络网课 2:10~3:05计网20道选择题 3:07~4:42政治1000题25道选择题纠错 …...
.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...
基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...
Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具
文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...
用机器学习破解新能源领域的“弃风”难题
音乐发烧友深有体会,玩音乐的本质就是玩电网。火电声音偏暖,水电偏冷,风电偏空旷。至于太阳能发的电,则略显朦胧和单薄。 不知你是否有感觉,近两年家里的音响声音越来越冷,听起来越来越单薄? —…...
保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek
文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama(有网络的电脑)2.2.3 安装Ollama(无网络的电脑)2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...
R语言速释制剂QBD解决方案之三
本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...
Java编程之桥接模式
定义 桥接模式(Bridge Pattern)属于结构型设计模式,它的核心意图是将抽象部分与实现部分分离,使它们可以独立地变化。这种模式通过组合关系来替代继承关系,从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...
Web后端基础(基础知识)
BS架构:Browser/Server,浏览器/服务器架构模式。客户端只需要浏览器,应用程序的逻辑和数据都存储在服务端。 优点:维护方便缺点:体验一般 CS架构:Client/Server,客户端/服务器架构模式。需要单独…...
