zoukankan      html  css  js  c++  java
  • php的三种设计模式






    <?php

    define("BASDIR",__DIR__);
    include BASDIR."/Phpclass/Loader.php";
    spl_autoload_register("\Phpclass\Loader::autoload_rege");

    //$db= new PhpclassFactory();

    //Factory.php中 的类中创建一个静态函数然后,在函数中创建一个对象并返回对象;这样子,就可以直接调用这个函数;从而达到创建对象的目的
    $db = PhpclassFactory::createDatabase();//再次设置后,就是工厂加单例模式
    echo "这是工厂模式 ";
    $db->where("11-- ");

    //var_dump($db);

    //单例模式,在Database.php中进行了相关的设置
    echo "这是单例模式------ ";
    $db = PhpclassDatabase1::getInstance();//获取单例模式的实例
    var_dump($db);
    $db = PhpclassDatabase1::getInstance();//获取单例模式的实例
    $db->order("同一个ID#2 ");
    $db = PhpclassDatabase1::getInstance();//获取单例模式的实例
    $db = PhpclassDatabase1::getInstance();//获取单例模式的实例

    $db->where("--test it's ok just a test----- ");
    $res=$db->where("2111--")->update("888+++")->order("33--")->limit("admin--");

    var_dump($res);

    echo "这是注册树模式------ ";

    PhpclassFactory::createDatabase();//单例模式的实例化一个对象(必须要实例化,不然,就无法注册)
    echo "3.5步,在拿对象使用前,必须调用PhpclassFactory::createDatabase(),实例化对象,不然后,没有对象的存在,就无法注册";
    $db = PhpclassRegister::get('db1');
    echo "第四步index1.php,调用PhpclassRegistor::get(name),拿对象用 ";
    //var_dump($db);
    $db->where("id=6,对象相关方法的调用 ");
    ---------------------------------------------------------------------------------Index1.php
    <?PHP
    namespace Phpclass;
    class Loader
    {
    static function autoload_rege($class)
    {
    include BASDIR.'/'.str_replace("\","/",$class).".php";
    }
    }
    
    
    ---------------------------------------------------------------------------------Loader.php
    
    
    <?php
    namespace Phpclass;

    //工厂模式是惯用的基础模式,其它高级模式都依赖于它
    class Factory
    {
    static function createDatabase()
    {
    // $db = new PhpclassDatabase();//若用了单例模式,工厂模式也就不能用new了(用new,就是传统的多态模式,相对浪费资源)
    // return $db; //这就是工厂模式


    // $db = Database1::getInstance();这是单例模式

    $db = Database1::getInstance();//这里用的是单例模式,即在Database1.php里面,创建一个自己new自己的静态方法,这边再调用
    // return $db;然后再返回这个对象;这样子,可以在new自己的时候判断,是否已经创建,若创建了就不再创建,若没有再创建,这样子就更
    // 省资源,到这里,就可以理解为 工厂模式和单例模式的组合

    echo "0步创建一个单例模式的对象Factory.php->调用Databases1::getinstance() ";
    Register::set('db1',$db);//把单例模式中创建的对象,都放到一个数组里面, 这样就变成了注册树模式
    echo "第二步注册对象,调用Register::set(), ";
    return $db;//若是用注册树模式,就没有必要返回值了,为了让工厂模式和单例模式都能显示出来,所以,就给了一个返回值
    }

    }
    
    
    ---------------------------------------------------------------------------------Factory.php
    <?php
    namespace Phpclass;
    class Register
    {

    protected static $objects;//这里把所有的对象存放到的个数组里面

    static function set($alias,$obj)//把一个对象注册到注册树上
    {
    self::$objects[$alias] = $obj;
    echo "第一步把注册好的对象,放到数组里面去,Register.php ";
    }

    static function get($alias)
    {
    return self::$objects[$alias];
    }

    function _unset($alias)
    {
    unset(self::$objects[$alias]);
    }

    }
    
    
    ---------------------------------------------------------------------------------Register.php
    <?php
    namespace Phpclass;
    class Database1
    {
    //这里对就是的是php的单例模式--------
    // static protected protected static 没有区别的
    //常用的修饰有 public protected private 可以理解为三种不同的权限范围,这三种可以用$this->$name来调用
    // static,修饰他们,表示静态方法 只能用self::$name,来调用,而其值,是保存在静态变量中的,有时需要被释放或销毁
    static protected $db;

    protected function __construct(){}//当把__construct()变为保护或私有时,就无法再被本类外 new一个对象了,因为,这时
    //__construct()方法,只能在本类中被调用,所以只有在类中被实例化

    static function getInstance()//static function函数中,不能使用$this
    {
    if(self::$db){
    return self::$db;
    }else{
    self::$db = new self();//new self() =new static(),在没有父类的情况下,两者没有区别,
    //若有继承父类new self(),可能指大类, 而new static,指向调用者的本类
    //new self()= new Database1(),即,在本类中,被protected/private修饰后,只能在本类中调用
    //若有继承,protected,可以调用父类,而private只能调用本类
    return self::$db;
    }
    }
    //这里对就是的是php的单例模式----------

    function where($where)
    {
    echo "--admin".$where;
    return $this;//关键点,若用链条式语句,PHP return $this,的含义为:返回自身
    }
    function update($id)
    {
    echo $id;
    return $this;
    }
    function limit($count)
    {
    echo $count;
    return $this;
    }
    function order($order) {
        echo $order;
        return $this;
      }
    }
    ---------------------------------------------------------------------------------Database1.php
     


  • 相关阅读:
    几个简单递归js 实现
    js中阻止事件冒泡
    判断是否IE 最酷的代码
    C# Hashtable 读取 key 和 value
    ubuntu搭建jdk+jenkins
    Shell逻辑运算符及表达式
    Linux命令的返回值
    python调用c/c++时传递结构体参数
    Git错误总结
    Bash Shell中命令行选项/参数处理
  • 原文地址:https://www.cnblogs.com/nfyx/p/10743364.html
Copyright © 2011-2022 走看看