Blogger Information
Blog 49
fans 0
comment 0
visits 38188
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
通过链式调用,将一个类委托给另一个类实现数据库的查询操作
超超多喝水
Original
505 people have browsed it

链式调用简介:

链式调用是每个函数最后都返回$this获取当前对象实例,从而实现多次循环引用下一个方法;

如下面这个:

<?php
class  Query
{
    public $table;
    public $field;
    public $limit;
    public function table($table)
    {
        $this->table = $table;
        return $this->table;
    }
    public function field($field)
    {
        $this->field = $field;
        return $this->field;
    }
    public function limit($limit)
    {
        $this->limit = $limit;
        return $this->limit;
    }
}
$query = new Query;
echo '<pre>';
print_r ($query->table('list'));
echo '<hr>';
print_r ($query->field('name1,name2'));
echo '<hr>';
print_r ($query->limit(10));
echo '<hr>';
//若想转为数组
$arr=[];
$arr['table'] = $query->table('list');
$arr['field'] = $query->table('name1,name2');
$arr['limit'] = $query->table(10);
print_r ($arr);
?>

可以用链式调用写为:

<?php
class  Query
{
    public $table;
    public $field;
    public $limit;
    public function table($table)
    {
        $this->table = $table;
        return $this;
    }
    public function field($field)
    {
        $this->field = $field;
        return $this;
    }
    public function limit($limit)
    {
        $this->limit = $limit;
        return $this;
    }
}
$query = new Query;
echo '<pre>';
print_r ($query->table('list')->field('name1,name2')->limit('10'));
?>

链式调用+事件委托实现数据库查询构造器

实例

//被委托的类
class  Query
{
    //创建类的唯一实例 pdo对象
    private static $db;//PDO实例
    protected $table;//表
    protected $field;//字段
    protected $limit;//限制行数

    //把__construct()限制为私有的 组织此类在外部进行实例化
    private function __construct()
    {

    }
    //创建静态连接方法
    public static function connect($dsn,$username,$pwd)
    {
        //创建PDO类的唯一实例 pdo对象
        if(is_null(static::$db))
        {
            static::$db = new PDO($dsn,$username,$pwd);
        }
        //返回query实例
        return new static();
    }
    //设置一个table方法给$table属性赋值,并返回当前对象$this;
    public function table($table)
    {
        $this->table = $table;
        return $this;
    }
    //设置一个field方法给$field属性赋值,并返回当前对象$this;
    public function field($field)
    {
        $this->field = $field;
        return $this;
    }
    //设置一个limit方法给$limit属性赋值,并返回当前对象$this;
    public function limit($limit)
    {
        $this->limit = $limit;
        return $this;
    }
        //设置一个getSql拼接一条查询sql语句并返回
    public function getSql()
    {
        //返回格式化的结果
        return sprintf("SELECT %s FROM %s LIMIT %d",$this->field,$this->table,$this->limit);
    }
    //设置一个select查询方法,返回一个静态调用pdo对象用query方法处理方法,以关联数组的方式取结果集
    public function select()
    {
        return static::$db->query($this->getSql())->fetchALL(PDO::FETCH_ASSOC);
    }
}
//模型类
class Db
{
    //方法拦截器去拦截方法委托给Query类执行
    static function __callStatic($method,$args)
    {
        //设置数据库链接必要参数
        $dsn = 'mysql:host=localhost;dbname=test';//localhost本地或域名或IP,test数据库名名称
        $username = 'root';//账号
        $pwd = 'root';//密码
        //获取到被委托的类query实例
        $query = Query::connect($dsn,$username,$pwd);
        //返回回调函数将方法给到query中执行
        return call_user_func([$query,$method],...$args);
    }
}
//链式调用 逐个传参 最后给到select方法,赋值给变量
$res = Db::table('cate')->field('catname,catid')->limit(5)->select();
//输出$res
echo '<pre>';
print_r($res);

运行实例 »

点击 "运行实例" 按钮查看在线实例


Correcting teacher:PHPzPHPz

Correction status:qualified

Teacher's comments:
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post