dmz社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 12134|回复: 237

[php知识] php常用设计模式实现代码

  [复制链接]
  • TA的每日心情

    2024-11-19 20:46
  • 签到天数: 244 天

    [LV.8]以坛为家I

    4434

    主题

    1459

    帖子

    1万

    积分

    会|员

    Rank: 9Rank: 9Rank: 9

    积分
    10734
    发表于 2018-11-16 18:00:04 | 显示全部楼层 |阅读模式

    本站资源全部免费,回复即可查看下载地址!

    您需要 登录 才可以下载或查看,没有帐号?立即注册

    x
    • 单例模式 (确保一个类只实例化一次并且可以自行实例化)
    • 工厂模式 (替代了new操作)
    • 策略模式 (使用不同的方法来达到同样的目的)
    • 观察者模式 (一个对象发生变化时其他对象也会触发相应的操作)
    • 适配器模式 (把不同的方法封装成统一的方法)
    • 注册模式 (把实例放进一个数组以供调用)
    虽然设计模式对于一个程序员不是必须要会的,但是这些设计模式却是在常见的php框架中都是很常见的,如国内主类框架ThinkPHP, Yii2等都有用到.


    [PHP] 纯文本查看 复制代码
    /* 
     * 单例模式
     * 确保此类只有一个实例并可以自行实例化
     * 用在: 数据库操作, 日志对象 等.
     */
    
    class single{
        public $db = NULL;
        static $instance = null;
    
        public function __construct() {        
            $this->db = new mysqli('127.0.0.1', 'root', 'root', 'test');
            if($this->db->connect_error){
                die('connect error:' . $this->db->connect_error);
            }
            echo "mysql connect successful\n";
        }
    
        static public function  getInstance(){
            if(!(self::$instance instanceof self)){
                self::$instance = new self();
                echo "aaa\n";
            }
            echo "bbb\n";
            return self::$instance;
        }
    
        public function __destruct() {
            $this->db->close();
        }
    }
    
    single::getInstance();
    single::getInstance();
    
    //输出:
    /*
        mysql connect successful
        aaa
        bbb
        bbb
    */

    [PHP] 纯文本查看 复制代码
    /**
     * 工厂模式
     * 用工厂方法代替new操作的一种模式
     */
    interface people{
        public function say();
    }
    
    class man implements people{
        public function say() {
            echo "i am man \n";
        }
    }
    
    class woman implements people{
        public function say() {
            echo "i am woman \n";
        }
    }
    
    class factory{
        public function createMan(){
            return new man();
        }
    
        public function createWoman(){
            return new woman();
        }
    }
    
    $f = new factory();
    $f->createMan()->say();
    $f->createWoman()->say();
    
    //输出
    /*
     i am man 
     i am woman 
     */
    /**

    [PHP] 纯文本查看 复制代码
    /**
     * 策略模式 [使用不同的方式达到同一个目的]
     * 场景:乘坐不同交通工具去公司上班
     */
    
    abstract class tools{
        abstract function working();
    }
    
    class bicyle extends tools{
        public function working() {
            echo __METHOD__ . "\n";
        }
    }
    
    class car extends tools{
        public function working() {
            echo __METHOD__ . "\n";
        }
    }
    
    class transport{
        public function running($obj){
            $obj->working();
        }
    
        /**
         * 使用魔术方法也可以达到上述效果
         * @param type $name
         * @param type $arguments
         */
        public function __call($name, $arguments) {
            $arguments[0]->$name();
        }
    }
    
    $t = new transport();
    $t->running(new car());
    $t->running(new bicyle());
    
    $t->working(new car());//使用魔术方法也可以达到上述效果
    
    //输出
    /*
        car::working
        bicyle::working
        car::working 
     */

    [PHP] 纯文本查看 复制代码
    /* 
     * 观察者模式
     * 当一个对象状态发生变化时,依赖它的对象全部收到触发操作
     * 发生场景:yii2的behavior,event
     */
    
    interface event{
        function run();
    }
    
    class e1 implements event{
        public function run() {
            echo __METHOD__ . "\n";
        }
    }
    
    class e2 implements event{
        public function run() {
            echo __METHOD__ . "\n";
        }
    }
    
    class observer{
        static $obs;
        
        function addObs($name, $obj){
            self::$obs[$name] = $obj;
        }
        function trigger(){
            foreach (self::$obs as $val){
                $val->run();
            }
        }
    }
    
    $o = new observer();
    $o->addObs('e1', new e1());
    $o->addObs('e2', new e2());
    $o->trigger();
    
    //输出
    /*
     e1::run
     e2::run 
     */

    [PHP] 纯文本查看 复制代码
    /* 
     * 适配器模式
     * 把不同的方法封装成统一的方法以供调用
     * 用在 数据库 mysql, mysqli, pdo 等
     */
    
    interface db{
        public function connect();
        public function query();
        public function close();
    }
    
    class mysqlA implements db{
        public $db;
        
        public function connect(){
            $this->db = mysqli_connect($host, $user, $password, $database, $port, $socket);
        }
        public function query(){
        }
        public function close(){
            mysqli_close($this->db);
        }
    }
    
    class mysqlB implements db{
        public $db;
        
        public function connect() {
            $this->db = new PDO($dsn, $username, $password);
        }
        
        public function query(){
        }
        
        public function close(){
            $this->db = null;
        }
    }

    [PHP] 纯文本查看 复制代码
    /* 
     * 注册模式
     * 把已有对象放入一个数组里以供调用
     */
    
    class register{
        static $objects;
        
        public static function set($name, $obj){
            self::$objects[$name] = $obj;
        }
        public static function get($name){
            return self::$objects[$name];
        }
    }
    
    class log{};
    
    register::set('log', new log());
    $log = register::get('log');

    回复

    使用道具 举报

    该用户从未签到

    23

    主题

    7814

    帖子

    1023

    积分

    终身会员[A]

    Rank: 7Rank: 7Rank: 7

    积分
    1023

    发表于 2018-11-16 21:55:44 | 显示全部楼层
    看帖回帖是美德!:lol
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    2

    主题

    7561

    帖子

    1054

    积分

    技冠群雄

    Rank: 6Rank: 6

    积分
    1054

    发表于 2018-11-16 22:02:16 | 显示全部楼层
    正需要,支持楼主大人了!
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    54

    主题

    7806

    帖子

    998

    积分

    终身会员[A]

    Rank: 7Rank: 7Rank: 7

    积分
    998

    发表于 2018-11-16 22:15:32 | 显示全部楼层
    好好 学习了 确实不错
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    23

    主题

    7844

    帖子

    984

    积分

    终身会员[A]

    Rank: 7Rank: 7Rank: 7

    积分
    984

    发表于 2018-11-17 02:40:34 | 显示全部楼层
    有道理。。。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    28

    主题

    7821

    帖子

    972

    积分

    终身会员[A]

    Rank: 7Rank: 7Rank: 7

    积分
    972

    发表于 2018-11-17 09:24:37 | 显示全部楼层
    学习了,不错,讲的太有道理了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    20

    主题

    7854

    帖子

    996

    积分

    终身会员[A]

    Rank: 7Rank: 7Rank: 7

    积分
    996

    发表于 2018-11-17 11:37:03 | 显示全部楼层
    么有分,谁能送我点积分啊::>_<::
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    49

    主题

    7865

    帖子

    940

    积分

    终身会员[A]

    Rank: 7Rank: 7Rank: 7

    积分
    940

    发表于 2018-11-17 11:41:55 | 显示全部楼层
    有竞争才有进步嘛
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    22

    主题

    7846

    帖子

    992

    积分

    终身会员[A]

    Rank: 7Rank: 7Rank: 7

    积分
    992

    发表于 2018-11-17 13:37:13 | 显示全部楼层
    支持一下:lol
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    23

    主题

    7814

    帖子

    1023

    积分

    终身会员[A]

    Rank: 7Rank: 7Rank: 7

    积分
    1023

    发表于 2018-11-17 13:48:48 | 显示全部楼层
    有竞争才有进步嘛
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|小黑屋|本站代理|dmz社区

    GMT+8, 2024-12-23 23:59 , Processed in 0.097292 second(s), 41 queries .

    Powered by Discuz! X3.4 Licensed

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表