zoukankan      html  css  js  c++  java
  • PHP之设计模式

    https://blog.csdn.net/self_realian/article/details/78228733

    掌握PHP各类设计模式,具备设计纯面向对象框架和系统能力是非常有必要的。给大家一个小建议吧,学习设计模式的时候,使用phpStorm工具,因为设计模式是纯面向对象的,有很多的类,phpStorm 这个IDE工具有很多的快捷方式能帮助你快速找到对应的类。那么废话少数说,下面进入正题吧。

     

    一、面向对象的高级特性 

    1,命名空间 

    最早的PHP是没有命名空间的,所有的代码都是在同一个命名空间下,这样就不能重载相同的类或函数,随着我们项目的工程越来越大,文件越来越多,这个时候产生命名冲突就会越来越多,代码也会越来越复杂。到PHP5.3的时候,出现了命名空间。规定所有命名空间放在文件的开头位置(关于命名空间的具体语法及使用这里就不说了,大家自行去学习。本篇博客主要说的是设计模式) 

    2,类自动载入 

    最早的时候我们载入类都是通过include或者require来实现,当PHP项目变大之后,载入的文件越来越多,那如果一个文件要依赖几十个类文件,那就要在这个文件的前边写几十个require,这样会给开发带来不便。通过自动载入就能很方便的载入我们需要的类(自动载入的知识也需要大家自己去学习)

    前边我们提了命名空间和类自动载入,那么现在我们就用这两个知识来搭一个PHP面向对象的基础框架。首先我们来说一下PSR-0这个规范(PHP面向对象编码规范)。这个规范有三项约定 

    1,PHP的命名空间必须与绝对路径一致 

    2,类名的首字母必须大写 

    3,除了入口文件之外,其它“.php”必须只有一个类,不能有其它的可执行的代码

    开发一个符合PSR-0规范的基础框架 

    1,全部使用命名空间 

    2,所有PHP文件必须自动载入,不能有include/require 

    3,单一入口文件

    PSR-0规范框架代码

    首先我给我的目录先截一下图 

     

    index.php

    <?php

    //入口文件

    define('BASEDIR', __DIR__);//整个框架的根目录

     

    include BASEDIR.'/Shulv/Loader.php';

     

    spl_autoload_register('\Shulv\Loader::autoload');

     

    ShulvObject::test();

     

    AppControllerHomeIndex::test();

    •  

    Object.php

    <?php

    namespace Shulv;

     

    class Object

    {

        static function test(){

            echo "test()"."<br />";

        }

    }

     

    //不能再有任何其它可执行的代码

    •  

    Loader.php

     

    <?php

    namespace Shulv;

     

    class Loader{

        static function autoload($class){

            require BASEDIR.'/'.str_replace('\', '/', $class).'.php';

        }

    }

    •  

    Index.php

    <?php

    namespace AppControllerHome;

     

    class Index{

        static function test(){

            echo __METHOD__;

        }

    }

    •  

    这里主要学的是思想,框架代码是很简单的。 

    3,SPL标准库简介(PHP标准库) 

    SPL中提供了很多常用数据结构的一些封装,具体的可以去php的官方网站(www.php.net/spl)来查看有关SPL的一些东西。

    //比如栈结构(先进后出)

    $stack = new SplStack();//栈主要有两种接口,就是进(push())和出(pop())

    $stack->push("data1 ");//入栈

    $stack->push("data2 ");//入栈

     

    echo $stack->pop();//出栈

    echo $stack->pop();//出栈

     

    输出结果:

    data2

    data1

    •  
    •  

    //队列结构

    $queue = new SplQueue();//队列是先进先出

     

    $queue->enqueue("data1 ");//入队列

    $queue->enqueue("data2 ");//入队列

     

    echo $queue->dequeue();//出队列

    echo $queue->dequeue();//出队列

     

    输出结果:

    data1

    data2

    •  

    //堆结构

    $heap = new SplMinHeap();

    $heap->insert("data1 ");//将数据插入到堆

    $heap->insert("data2 ");//将数据插入到堆

     

    echo $heap->extract();//从堆中取出数据

    echo $heap->extract();

     

    运行结果

    data1

    data2

    本篇博客主要是讲集中基础的设计模式: 

    1,工厂模式 

    2,单例模式 

    3,注册模式

    一,工厂模式 

    我们可以设计出来一个工厂(其实就是类),该工厂的作用就是为我们生产各种对象。这种工厂通常只要指定类名,就可以据此获取

    <?php

    namespace Shulv;

     

    class Factory{

        //Instance表示“实例”,也就是指“对象”

        static function getInstance($className){//将要实例化的类名传递过来

            if(file_exists('./'.$className.'.class.php')){

                $obj1 = new $className();

                return $obj1;

            }else{

                return 'not exist';

            }

        }

    }

    •  

    二,单例模式 

    对于某些类,在使用它的时候,从头到尾(从程序的开始到结束),都只需要一个对象,就可以完成所有的人物 

    * 单例: 

    * 某个类只允许创建出一个对象,即使去创建多次,也只能得到一个对象(就比如创建一个连接数据库的对象,前前后后只要创建一个就行)

    //实现一个单例类:其只能获得一个对象

    class B{

        private static $instance;//定义成私有,那么它只能在本类中使用。定义成静态就能通过类名来访问了

        private function __construct(){}//定义成私有,也就是不让别人在类外new 出对象,这样就只能通过getNew()获取对象

        public static function getNew(){

            //如果本类中的$instance还没有数据

            if(!isset(B::$instance)){

                B::$instance = new self;

            }

            return B::$instance;

        }

        private function __clone()

        {

     

        }

    }

    $o1 = B::getNew();

    $o2 = B::getNew();

    //我们会发现这创建的还是一个类(资源标识符相同)

    //var_dump($o1,$o2);

    //下面我们再看一下一个特殊情况

    $o3 = clone $o1;//克隆对象(当我把那个__clone()方法定义成私有,这句就会报错)

    var_dump($o1,$o2,$o3);//这个时候我们会发现$o3是一个新对象了   这个时候又不符合单例了(注意:这个clone算运算符)

    /*

     *本来一个类中有一个隐藏的public function __clone()方法,那我们如果想实现单例,我们给它定义成私有就行,不让他在类外使用

     */

    •  

    三,注册模式 

    全局共享和交换对象

    <?php

     

    namespace Shulv;

    /*

    注册模式就是用来将一些对象注册到我们的全局事物上边,那就可以在任意位置访问

    */

    class Register{

        protected static $objects; 

        function set($alias, $object){//表示将一个对象注册到全局的注册树上

            self::$objects[$alias] = $object;//第一个参数表示取的别名

        }

        function _unset($alias){//注意:这个_unset()不是魔术方法,魔术方法那个是__unset()(两个下划线)

            //表示从树上移除

            unset(self::$objects[$alias]);

        }

        function get($name){

            return self::$objects[$alias];

        }

    }

     

    //当我们在工厂模式中获得对象之后,再将获得的对象映射到全局树上,那么工厂模式就只用构造一次

     

    Register::set('A',$a);//A是别名(加在工厂模式中)

    •  
  • 相关阅读:
    ios 工具大全,最全框架
    获取APP的启动图 -Launch Image
    OCP-052考试题库汇总(3)-CUUG内部解答版
    OCP-052考题汇总(2)-CUUG内部解答版
    OCP-052考题汇总(1)-CUUG内部解答版
    【第60题】【062题库】2019年OCP认证062考试新题
    【第59题】【062题库】2019年OCP认证062考试新题
    【第58题】【062题库】2019年OCP认证062考试新题
    【第57题】【062题库】2019年OCP认证062考试新题
    【第56题】【062题库】2019年OCP认证062考试新题
  • 原文地址:https://www.cnblogs.com/rxbook/p/9365688.html
Copyright © 2011-2022 走看看