博客列表 >通过链式调用,将一个类委托给另一个类实现数据库的查询操作

通过链式调用,将一个类委托给另一个类实现数据库的查询操作

超超多喝水
超超多喝水原创
2021年08月21日 10:48:15503浏览

链式调用简介:

链式调用是每个函数最后都返回$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);

运行实例 »

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


声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议