博客列表 >静态方法数据库查询的链式操作--2019年6月17日22:30分

静态方法数据库查询的链式操作--2019年6月17日22:30分

白守的博客
白守的博客原创
2019年06月23日 21:13:451079浏览

本篇文章主要知识点

1.方法重载和属性重载(重点)


案例内容

数据库查询的链式操作


zy01.php的内容

实例

<?php

// 注意,下面这些代码是自己敲的,但是注释是复制老师的.
require 'zy02.php';


class Db
{
    // 数据库连接对象,受保护的静态对象
    protected static $pdo = null;

    // 数据库连接方法,每次查询时再连接, 实现真正的惰性连接,节省系统开销
    public static function connection()
    {
        // 连接数据库,数据库的地址和账号密码
        self::$pdo = new PDO('mysql:host=localhost;dbname=php','root','root');
    }

    public static function __callstatic($name,$arguments)
    {
        // 创建一个pdo对象,并连接数据库
        self::connection();
        // 实例化查询类,将连接对象做为参数
        $query = new query(self::$pdo);
                // 执行查询类Query中的对象方法, 注意参数是数组,我只需要第一个参数:表名, 所以加了索引键名
        return call_user_func_array([$query,$name],[$arguments[0]]);

    }
}
// 客户端的链式调用
// 以Db类做入整数数据库操作的入口, SQL语句的各个部分用对象方法提供
// 链式操作是现代PHP框架的基础,非常有用

$staffs = Db::table('staff')
        ->field('staff_id,name,position,mobile')
        ->where('staff_id > 2') // = 2,只会输出一条
        ->limit(5)
        ->select();

foreach ($staffs as $staff) {
    print_r($staff); echo '<br>';
}

运行实例 »

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




zy02.php文件的内容

实例

<?php

// 数据库查询类

class Query
{
    // 连接对象
    public $pdo = null;

    // 数据表名
    public $table = '';

    // 字段列表
    public $field = '';

    // 查询条件
    public $where = '';

    // 显示数量
    public $limit = 0;

    // 构造方法,初始化连接对象
    public function __construct($pdo)

    {
        // 连接对象是对象方法的共享属性
        $this->pdo = $pdo;
    }
    // 调用表名
    public function table($tablName)
    {
        $this->table = $tablName;

        // 返回当前对象,便于链式调用该对象的其它方法
        return $this;
    }

    // 设置查询字段
    public function field($fields)
    {
        $this->field = $fields;
        return $this;
    }

    // 设置查询条件
    public function where($where)
    {
        $this->where = $where;
        return $this;
    }

    // 设置显示数量
    public function limit($limit)
    {
        $this->limit = $limit;
        return $this;
    }

    public function select()
    {
        // 查询条件分开设置, 可以确保链式方法独立
        // 然后判断是否为空
        $fields = empty($this->fields) ? '*' : $this->field;
        $where = empty($this->where) ? 'WHERE ': $this->where;
        $limit = empty($this->limit)? ' LIMIT ':$this->limit;
        
        // 拼接sql语句
        $sql = 'SELECT '.$fields. ' FROM '.$this->table.$where . $limit;
        // 预处理查询
        $stmt = $this->pdo->prepare($sql);
        $stmt->execute();
        return $stmt->fetchAll(PDO::FETCH_ASSOC);
        
    }
}

运行实例 »

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


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