• PHP设计模式初探 以前写的完整PPT!!!!!


    幻灯片 1:

    初探PHP设计模式

    copyright          CSDN  白毛大侠

    幻灯片 2:

    我们说别人代码写的烂,烂在哪?

    反思我们平时是怎么写代码的?

    非开发者如何转开发(业务) ?


    一.过程与对象

    幻灯片 3:


    echo “开火”;
    echo “煎鱼”;
    echo “烧水”
    echo “水滚,放鱼”
    echo “起锅”

    echo “开火”;
    echo “煎鱼”;
    echo “放调料”
    echo “再煎”
    echo “起锅”


    内容1
    面向过程的代码

    幻灯片 4:

    1

    3

    2


    代码无法重用
    代码属于堆砌状态
    会被接手的人诅咒
    问题

    幻灯片 5:

    function zhuyu(){
     echo “开火”;
    echo “煎鱼”;
    echo “烧水”
    echo “水滚,放鱼”
    echo “起锅”} 
    function jianyu(){
     echo “开火”;
    echo “煎鱼”;
    echo “放调料”
    echo “再煎”
    echo “起锅”}
    zhuyu();
    jianyu();


    内容1
    面向结构化的代码

    幻灯片 6:
    1

    3

    2


    代码可重用
    方便调用
    结构清晰
    优点

    1

    3

    2
    文件做为结构化编程的一个集合单元,那么,文件的数量会越来越多
    勉强的解决方案:
    目录做为更大的集合
    问题
    自己都不记得哪里被调用过
     Function不易找到
    不知是否声明过、写过类似功能的function 
    function命名易重名,


    新代码的修改会破坏原有代码,存在新的bug隐患。


    幻灯片 7:

    面向对象:考虑维护期的设计方式

    我才是主角
    觉悟吧!!

    幻灯片 8:
        Class Student { 
            public $name;
            public $age;
            protected $grade;

           //constract

            public function showInfo() {
                echo $this -> name.":".$this -> age;
            }
            
            public function xuehao() {
                echo "
    学号:".($this->age + 10);
            }
        }

        $stu1 = new Student();
        $stu1 -> name = "zhangsan";
        $stu1 -> age = "24";
        $stu1 -> showInfo();
        $stu1 -> xuehao();
    ?>

    幻灯片 9:

    PHP面向对象三大特征封装、多态、继承

    幻灯片 10:
    封装
    封装就是把抽象出的数据和对数据的操作封装在一起,数据被保护在内部,程序的其他部分只有通过被授权的操作(成员方法)才能对数据进行操作。

    通俗来说:
    封装是php面向对象的其中一个特性,将多个可重复使用的函数封装到一个类里面。在使用时直接实例化该类的某一个方法,获得需要的数据

    如果是私有的方法和属性值,外部无法访问,具有一定的保护作用。

    幻灯片 11:
    继承
    所谓继承,就是一个子类通过extends 父类 把父类的一些(public / protected)属性和(public / protected)方法继承下来。不能继承私有的

    幻灯片 12:
       //简单的继承例子 
        //父类
        Class Student {
            public $name;
            protected $age;
            protected $grade;

            /*function __construct() {
                 echo 1234;
                 $this->name = 5555;
            }*/

            public function showInfo() {
                echo $this -> name."
    ".$this -> age;
            }
        }

        /**
        * 小学生
        */
        class Pupil extends Student
        {
            /*function __construct() {
                parent::__construct();
                var_dump($this->name);
                 echo 'xiaoxuesheng';
                 $this->name = 'xiaoxuesheng';
            }*/
            
            public function test() {
                echo "
    小学生在考试。。。";
            }
        }

        /**
        * 大学生
        */
        class Graduate extends Student
        {
            public function test() {
                echo "
    大学生在考试。。。";
            } 
        }

        $stu1 = new Pupil();
        $stu1 -> name = "lizzy";
        $stu1 -> test();
        $stu1 -> showInfo();

        $stu2 = new Graduate();
        $stu2 -> name = "zxm";
        $stu2 -> test();
        $stu2 -> showInfo();
    ?>

    幻灯片 13:
       //(1)protected属性和方法受保护,在子类不能直接调用,要在子类中定义方法访问。  
       Class ParentClass {
        public $name = 'lizzy';
        protected $age = 24;
        private $sex = "女";

        public function test1() {
            echo "
    展示public方法";
        }

        protected function test2() {
            echo "
    展示protected方法";
        }

        private function test3() {
            echo "
    展示private方法";
        }
    }

    Class SubClass extends ParentClass {
        function show() {
            echo "age=".$this->age;
            // echo "sex=".$this->sex;//是不能继承下来的
            $this -> test2();
            // $this -> test3(); //间接访问都不行
        }
    }

    $sub1 = new SubClass();
    $name=$sub1 -> name;
    var_dump($name);


    $sub1 -> show(); //show直接访问,test2可以间接访问

    $sub1 -> test1();//可以直接访问 
    $name=$sub1 -> test2;//不能直接访问
    $name=$sub1 -> test3;//不能直接访问


    幻灯片 14:
    (1)protected属性和方法受保护,在子类不能直接调用,要在子类中定义方法访问。

    (2)如果希望子类调用父类的构造方法,或者其他方法(public / protected),可以使用类名::方法名; 或者parent::方法名;

    (3)当一个子类的方法和父类方法(protected/public)完全一致时,我们称之为方法的覆盖(重写)。


    幻灯片 15:
    多态

    一个类,被多个子类继承,如果这个类的某个方法,在多个子类中,表现出不同的功能,我们称这种行为为多态。
    (同一个类的不同子类表现出的不同行态)

    多态的实现必须要满足三个条件:一是子类继承父类,二是子类重写父类的方法,三是父类引用指向子类对象

    幻灯片 16:
     //当一个父类知道所有的子类都有一个方法
     //但是父类不能确定该方法究竟如何写,可以让子类去覆盖这个方法。
     Class Animal {
       function cry() { 
        echo “发声叫"; 
        } 
      } //重写 
     
     Class Dog extends Animal { 
        function cry() { echo "小狗汪汪叫"; } 
    } //重写
     
    Class Pig extends Animal {
        function cry() { echo "小猪哼哼叫"; } 

    $dog = new Dog(); 
    $dog -> cry(); 
    echo "
    ";
    $pig = new Pig(); 
    $pig -> cry(); 
    ?> 

    幻灯片 17:

    设计模式不是拳打脚踢
    它是一套降龙十八掌

    幻灯片 18:

    幻灯片 19:

    幻灯片 20:

    Singleton(单例模式):单例模式是最常见的模式之一,在Web应用的开发中,常常用于允许在运行时为某个特定的类创建仅有一个可访问的实例。
    Factory(工厂模式):工厂模式是另一种非常常用的模式,正如其名字所示:确实是对象实例的生产工厂。某些意义上,工厂模式提供了通用的方法有助于我们去获取对象,而不需要关心其具体的内在的实现。


    单例模式

    工厂模式

    幻灯片 21:


    class Single {
        private $name;//声明一个私有的实例变量
        private function __construct(){//声明私有构造方法为了防止外部代码使用new来创建对象。
        }
        static public $instance;//声明一个静态变量(保存在类中唯一的一个实例)
            static public function getinstance(){//声明一个getinstance()静态方法,用于检测是否有实例对象
            if(!self::$instance) self::$instance = new self();
                return self::$instance;
        }
        public function setname($n){
            $this->name = $n; 
        }
        public function getname(){
            return $this->name; 
        }
    }
    $oa = Single::getinstance();
    var_dump($oa);
    $oa->setname('hellow');
    $ob = Single::getinstance();

    echo $oa->getname();//hellow
    echo $ob->getname();//hellow

    单例模式

    幻灯片 22:


    工厂模式

    幻灯片 23:


    工厂模式

    幻灯片 24:


    class CommsManager {
        const BLOGGS = 1;
        const MEGA = 2;
        private $mode = 1;

        public function __construct( $mode )
        {
            $this->mode = $mode;
        }  

        function getApptEncoder()
        {
            switch($this->mode) {
                case (self::MEGA):
                    return new MegaApptEncoder();
                default:
                    return new BloggsApptEncoder();
            }    
        }
    }
    $comms = new CommsManager(CommsManager::MEGA);
    $appEncoder = $comms->getApptEncoder();
    Print $apptEncoder->encode();
    工厂模式

    幻灯片 25:

    框架是有灵魂的,看你是否能心意相通

    幻灯片 26:


    工厂模式

    幻灯片 27:
    谢谢
    观看

  • 相关阅读:
    LeetCode 619, 58, 24
    多线程基本概念
    【QML】QML控件组件
    机器学习笔记之粒子滤波(一)序列重要性采样
    ts随记:面向对象、泛型
    ElasticSearch——手写一个ElasticSearch分词器(附源码)
    C和指针 第15章 输入/输出函数 15.14 流错误函数
    git 查漏补缺
    SUSCTF 2022 Crypto复现
    提升Python执行速度,1行代码就够了
  • 原文地址:https://blog.csdn.net/qq_32484211/article/details/136415443