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道选择题纠错 …...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...

循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...

ios苹果系统,js 滑动屏幕、锚定无效
现象:window.addEventListener监听touch无效,划不动屏幕,但是代码逻辑都有执行到。 scrollIntoView也无效。 原因:这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作,从而会影响…...
LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》
这段 Python 代码是一个完整的 知识库数据库操作模块,用于对本地知识库系统中的知识库进行增删改查(CRUD)操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 📘 一、整体功能概述 该模块…...

STM32---外部32.768K晶振(LSE)无法起振问题
晶振是否起振主要就检查两个1、晶振与MCU是否兼容;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容(CL)与匹配电容(CL1、CL2)的关系 2. 如何选择 CL1 和 CL…...
ubuntu22.04 安装docker 和docker-compose
首先你要确保没有docker环境或者使用命令删掉docker sudo apt-get remove docker docker-engine docker.io containerd runc安装docker 更新软件环境 sudo apt update sudo apt upgrade下载docker依赖和GPG 密钥 # 依赖 apt-get install ca-certificates curl gnupg lsb-rel…...

jdbc查询mysql数据库时,出现id顺序错误的情况
我在repository中的查询语句如下所示,即传入一个List<intager>的数据,返回这些id的问题列表。但是由于数据库查询时ID列表的顺序与预期不一致,会导致返回的id是从小到大排列的,但我不希望这样。 Query("SELECT NEW com…...

aurora与pcie的数据高速传输
设备:zynq7100; 开发环境:window; vivado版本:2021.1; 引言 之前在前面两章已经介绍了aurora读写DDR,xdma读写ddr实验。这次我们做一个大工程,pc通过pcie传输给fpga,fpga再通过aur…...