龚哥哥 - 山里男儿 爱生活、做自己!
PHP标准工厂模式
发表于 2015-9-24 | 浏览(6246) | 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');

?>

阅读全文

PHP单例模式 设计模式 面向对象
发表于 2015-8-31 | 浏览(5663) | PHP
<?php

/**
 * 单例模式
 * @author  Devil
 * @version v_0.0.1
 */
class Singleton
{
    private $parem;

    /**
     * [__construct 构造方法]
     * @param [mixed] $param [参数]
     */
    private function __construct($param)
    {
        $this->param = $param;
    }

    /**
     * [Instantiate 静态方法, 用于实例化类]
     * @param  [mixed] $param [参数]
     * @return [object]   [类对象]
     */
    public static function Instantiate($param)
    {
        static $object = null;
        if(!is_object($object)) $object = new self($param);
        return $object;
    }

    /**
     * [Show 测试方法]
     */
    public function Show()
    {
        print_r($this->param);
    }
}

/**
 * 使用列子
 */
$param = array('test', 'demo', 'devil');
$obj = Singleton::Instantiate($param);
$obj->Show();

/**
 * $obj = Singleton::Instantiate($param);
 * 不管在项目中多少次这么对类进行实例化,都不会重复创建类对象。
 * $object 被定义成静态变量,不能被第二次赋值。
 * 只要$object是一个对象就直接返回当前对象,则进行实例化并返回。
 *
 * 单例模式可以防止重复创建对象,减轻内存开销。
 */

?>

阅读全文

TOP