php的三种设计模式






<?php

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

//$db= new \Phpclass\Factory();

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

//var_dump($db);

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

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

var_dump($res);

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

Phpclass\Factory::createDatabase();//单例模式的实例化一个对象(必须要实例化,不然,就无法注册)
echo "3.5步,在拿对象使用前,必须调用Phpclass\Factory::createDatabase(),实例化对象,不然后,没有对象的存在,就无法注册";
$db = \Phpclass\Register::get('db1');
echo "第四步index1.php,调用\Phpclass\Registor::get(name),拿对象用\n";
//var_dump($db);
$db->where("id=6,对象相关方法的调用\n");
---------------------------------------------------------------------------------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 \Phpclass\Database();//若用了单例模式,工厂模式也就不能用new了(用new,就是传统的多态模式,相对浪费资源)
// return $db; //这就是工厂模式


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

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

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

}

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

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

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

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
 


posted @ 2019-04-20 23:27  牛粪也香  阅读(248)  评论(0编辑  收藏  举报