• 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;
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 开放封闭原则(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;
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 里氏替换原则(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.
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 接口隔离原则(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.";
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 依赖倒置原则(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!";
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 合成/复用原则(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
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 最小知识原则(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;
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    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负责数据的处理。它们共同协作,使得应用程序可以有组织、高效地处理业务需求。


  • 相关阅读:
    认识doubbo和rpc
    【图像分割】实战篇(1)传统图像分割
    R语言使用strsplit函数基于指定字符或者字符串分割字符串、使用sub函数进行字符串替换
    用户身份验证的令牌—Token教程
    CVPR 2024 | 双手协作双物体的数据集TACO:引领可泛化手物交互的新方向
    react ts实现一个 无限加载组件
    Hooks进阶--useEffect - 发送网络请求
    iOS脱壳之frida-ios-dump
    Flink异步I/O算子原理解析+源码详解
    ICC2: ICG clone与ICG merge
  • 原文地址:https://blog.csdn.net/qq_34608447/article/details/132843059