龚哥哥 - 山里男儿 爱生活、做自己!
PHP标准工厂模式
发表于 2015-9-24 | PHP
<?php

//定义接口
interface database
{
    public function connect($param);  //定义接口方法
    public function query($sql);  //定义接口方法
    public function fetch($query);  //定义接口方法
}

//接口继承
class mysql implements database
{
    //集成上面 connect 的接口
    public function connect($param)
    {
        echo 'mysql::connect('.$param.')';
    }

    //集成上面 query 的接口
    public function query($sql)
    {
        echo 'mysql::query('.$sql.')';
    }

    //集成上面 fetch 的接口
    public function fetch($query)
    {
        echo 'mysql::fetch('.$query.')';
    }
}

//接口继承
class sqlserver implements database
{
    public function connect($param)
    {
        echo 'sqlserver::connect('.$param.')';
    }

    public function query($sql)
    {
        echo 'sqlserver::query('.$sql.')';
    }

    public function fetch($query)
    {
        echo 'sqlserver::fetch('.$query.')';
    }
}

//接口继承
class oracle implements database
{
    public function connect($param)
    {
        echo 'oracle::connect('.$param.')';
    }

    public function query($sql)
    {
        echo 'oracle::query('.$sql.')';
    }

    public function fetch($query)
    {
        echo 'oracle::fetch('.$query.')';
    }
}

class dbfactory
{
    private $objects = array();
    private $classes = array();

    public function __construct()
    {
        $this->classes = array(
                'mysql',
                'sqlserver',
                'oracle'
            );

        for($i=0; $i<count($this->classes); $i++)
       {
            if(in_array('database', class_implements($this->classes[$i], false)))
           {
                $this->objects[$this->classes[$i]] = new $this->classes[$i];
            } else {
                unset($this->classes[$i]);
            }
        }
    }

    public function query($sql, $type = 'mysql')
    {
        // empty 检测变量对象 $this->objects 是否为空
        if(empty($this->objects))
        {
            exit('No class');
        }
        //检测 $this->classes 成员属性数组对象中是否存在 $type 传递过来的值,这里 ! 号 取反,有则 执行 if 外面
        if(!in_array($type, $this->classes))
        {
            exit('NO '.$type.' 没有继承接口');  //没有这个值的时候结束当前函数操作并退出
        }

        //下面这句话同等: $object = new mysql();   $object->query($sql);
        $this->objects[$type]->query($sql);  //实例化 类 及调用类里面的方法
    }
}

$factory = new dbfactory();
$factory->query('SELECT * FROM member', 'mysql');
echo '<hr/>';
$factory->query('SELECT * FROM member', 'sqlserver');
echo '<hr/>';
$factory->query('SELECT * FROM member', 'oracle');

?>

发表评论:

TOP