php程序设计的基本原则

2023-09-12 23:29:02
  • 单一职责原则(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各自承担不同的责任:

  1. Model:

    • Model 代表了应用程序的数据结构。它通常包含了与数据相关的业务逻辑、数据的访问、以及持久化等。
    • 在一个PHP应用中,Model通常指代数据对象,比如一个数据库表对应的模型,或者其他数据实体。
    • Model 负责与数据库交互,进行数据的读取、写入、更新等操作。
  2. DAO (Data Access Object):

    • DAO 是用来与数据源进行交互的一个层。它提供了一个抽象接口,使得应用程序可以独立于具体的数据存储方式(比如数据库)。
    • DAO 负责处理底层的数据库操作,包括连接数据库、执行SQL查询等。
    • DAO 将数据库返回的数据转化为适合应用程序使用的数据格式,通常是Model。
  3. Logic:

    • Logic 层是业务逻辑的处理部分,它包含了应用程序的主要业务逻辑。
    • Logic 层不应该直接与数据库交互,而是通过调用Service来实现业务需求。
  4. Service:

    • Service 提供了一个高级的接口,用于实现特定的业务逻辑。
    • Service 层负责协调多个Model和DAO,实现复杂的业务逻辑,同时也是Controller和Model之间的桥梁。
    • Service 可以调用多个DAO来获取数据,也可以对数据进行处理后返回给Controller。
  5. Controller:

    • Controller 接收来自用户的请求,并决定如何响应。它是用户与应用程序之间的接口。
    • Controller 负责调用适当的Service来处理业务逻辑,并将结果返回给View或者前端。

交互流程:

  1. Controller调用Service:

    • Controller 接收到用户的请求后,根据请求的内容调用相应的Service。
    • Service 接收到请求后,会根据业务逻辑调用相应的DAO或者Logic来完成具体的任务。
  2. Service协调Model和DAO:

    • Service 可以调用多个Model和DAO来满足业务需求。
    • Service 可以处理Model之间的关系,进行数据的组合或拆分。
  3. DAO与数据库交互:

    • DAO 负责与数据库进行交互,执行SQL查询,返回结果给Service。
  4. Logic处理业务逻辑:

    • Logic 负责处理复杂的业务逻辑,它可能需要对多个Model进行操作,以实现特定的业务需求。
  5. Model处理数据:

    • Model 负责与数据相关的逻辑,可能包括数据的验证、转换、持久化等。
  6. 结果返回给Controller:

    • 最终结果会从Service返回给Controller,然后Controller可以将结果展示给用户,或者进行其他处理。

总的来说,各层之间的交互是有层次关系的,Controller是接收用户请求的入口,Service是处理业务逻辑的核心,DAO负责数据库交互,Logic处理业务逻辑的具体细节,Model负责数据的处理。它们共同协作,使得应用程序可以有组织、高效地处理业务需求。


更多推荐

【Jetpack】Navigation 导航组件 ④ ( Fragment 跳转中使用 safe args 安全传递参数 )

文章目录一、页面跳转间的传统的数据传递方式1、传统的数据传递方式-Bundle传递数据1、Navigation组件中的Bundle数据传递2、传统数据传递实现步骤3、FragmentA完整代码示例4、FragmentB完整代码示例5、执行结果2、使用Bundle传递数据安全性差二、页面跳转间的传统的数据传递方式1、导入

C++--哈希表的实现及unorder_set和unorder_map的封装

1.什么是哈希表哈希表是一种数据结构,用来存放数据的,哈希表存放的数据是无序的,可以实现增删查,当时不能修改数据。可以不经过任何比较,一次直接从表中得到要搜索的元素。如果构造一种存储结构,通过某种函数(hashFunc)使元素的存储位置与它的关键码之间能够建立一一映射的关系,那么在查找时通过该函数可以很快找到该元素。该

知乎万赞的:网络安全系统自学就业路线,建议收藏!

为什么说网络安全是新风口?近几年,随着移动互联网、大数据、云计算、人工智能等新一代信息技术的快速发展,围绕网络和数据的服务与应用呈现爆发式增长,丰富的应用场景下暴露出越来越多的网络安全风险和问题。但是,我国网络安全整体投入不高。网络安全建设方面,国内网络安全投入占信息化的投入比例大概不到百分之3%,而欧美等发达国家均在

Python 超高频常见字符操作【建议收藏】

文章目录前言1.字符串截取2.字符串拼接3.字符串搜索4.字符串格式化5.字符串替换6.字符串去除空格7.字符串截取8.字符串反转总结前言为了巩固所学的知识,作者尝试着开始发布一些学习笔记类的博客,方便日后回顾。当然,如果能帮到一些萌新进行新技术的学习那也是极好的。作者菜菜一枚,文章中如果有记录错误,欢迎读者朋友们批评

A Survey of Hallucination in “Large” Foundation Models

本文是LLM系列文章,针对《ASurveyofHallucinationin“Large”FoundationModels》的翻译。大型基础模型幻觉现象综述摘要1引言2大语言模型中的幻觉3大图像模型中的幻觉4大视频模型中的幻觉5大音频模型中的幻觉6幻觉不总是有害的:不同的视角7结论和未来方向7.1幻觉的自动评估7.2利

解密堆排序与TopK问题

📙作者简介:清水加冰,目前大二在读,正在学习C/C++、Python、操作系统、数据库等。📘相关专栏:C语言初阶、C语言进阶、C语言刷题训练营、数据结构刷题训练营、有感兴趣的可以看一看。欢迎点赞👍收藏⭐留言📝如有错误还望各路大佬指正!✨每一次努力都是一种收获,每一次坚持都是一种成长✨目录前言1.堆排序1.1时间

Chrome扩展开发实战:网页图片抓取,打造专属自己的效率插件

🏆作者简介,黑夜开发者,CSDN领军人物,全栈领域优质创作者✌,CSDN博客专家,阿里云社区专家博主,2023年6月csdn上海赛道top4。🏆数年电商行业从业经验,历任核心研发工程师,项目技术负责人。🏆本文已收录于专栏:100个JavaScript的小应用。🎉欢迎👍点赞✍评论⭐收藏文章目录🚀一、背景🚀二

【C++多线程】Lambda表达式

定义Lambda表达式可以说是c++11引用的最重要的特性之一,虽然跟多线程关系不大,但是它在多线程的场景下使用很频繁,所以在多线程这个主题下介绍它更合适。Lambda来源于函数式编程的概念,也是现代编程语言的一个特点。C++11这次终于把Lambda加进来了,令人非常兴奋,因为Lambda表达式能够大大简化代码复杂度

《DevOps实践指南》- 读书笔记(七)

DevOps实践指南Part5第三步:持续学习与实验的技术实践19.将学习融入日常工作19.1建立公正和学习的文化19.2举行不指责的事后分析会议19.3尽可能广泛地公开事后分析会议结果19.4降低事故容忍度,寻找更弱的故障信号19.5重新定义失败,鼓励评估风险19.6在生产环境注入故障来恢复和学习19.7创建故障演练

利用容器技术优化DevOps流程

利用容器技术优化DevOps流程随着云计算的快速发展,容器技术也日益流行。容器技术可以打包和分发应用程序,并实现快速部署和扩展。在DevOps流程中,容器技术可以大大优化开发、测试、部署和运维各个环节。本文将介绍如何利用容器技术优化DevOps流程。首先,让我们了解一下背景知识。在传统的软件开发过程中,开发人员需要在本

DevOps&Apipost

DevOps旨在通过自动化流程和改善协作,实现软件开发、测试和交付的一体化,从而提高软件交付的质量和速度。为了提高工作效率,加快软件的交付流程,越来越多企业的选择DevOps工作流程。其中API管理的地位非常重要。随着API数量的大幅增长,也带来了新的API管理需求。如何在DevOps工作流中进行API全生命周期管理,

热文推荐