Blogger Information
Blog 43
fans 0
comment 0
visits 26781
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
链式查询和期静态绑定的原理+2018年9月4日
Lee的博客
Original
622 people have browsed it

使用方法重载与call_user_func_array()模拟TP框架的链式查询

实例

<?php
class Query{
    // 保存sql语句中的各个组成部分
    private $sql = [];
    // 数据库的连接对象
    private $pdo = null;
    //构造方法: 连接数据库
    public function __construct()
    {
        // 连接数据库并返回pdo对象
        $this->pdo = new PDO('mysql:host=127.0.0.1;dbname=php','root','root');
    }
    // table()获取sql语句的表名
    public function table($table){
        $this->sql['table'] = $table;
        return $this;  //返回当前类实例对象,便于链式调用该对象的其它方法
    }
    // fields()获取sql语句的字段列表
    public function fields($fields){
        $this->sql['fields'] = $fields;
        return $this;
    }
    // where()获取sql语句的查询条件
    public function where($where){
        $this->sql['where'] = $where;
        return $this;
    }
    //执行查询,是一个终级方法
    public function select(){
        //拼装SELECT查询语句
        // SELECT 字段列表 FROM 表名 WHERE 条件
        $sql = "SELECT {$this->sql['fields']} FROM {$this->sql['table']} WHERE {$this->sql['where']}";
        $stmt = $this->pdo->prepare($sql);
        $stmt->execute();
        return $stmt->fetchAll(PDO::FETCH_ASSOC);
    }
}

运行实例 »

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


实例

<?php
// Db::table()->fields()->where()->select();
require 'Query.php';

// 数据库操作的入口类
class Db{
    public static function __callStatic($name, $arguments)
    {
        //call_user_func_array([类名, 方法],[])
        //call_user_func_array([对象, 方法],[])
        return call_user_func_array([(new Query()),$name],$arguments);
    }
}

$result = Db::table('staff')
             ->fields('staff_id,name,age,salary')
             ->where('staff_id <= 10')
             ->select();

// 用表格将查询结果格式化输出
$table = '<table border = "1" cellpadding = "6" cellspacing = "0" width = "65%" align = "center">';
$table .= '<caption style = "font-size:1.6rem;margin:15px;">员工信息表</caption>';
$table .= '<tr bgcolor="grey;"><th>ID</th><th>姓名</th><th>年龄</th><th>工资</th></tr>';

foreach ($result as $staff){
    $table .= '<tr align ="center">';
    $table .= '<td>'.$staff['staff_id'].'</td>';
    $table .= '<td>'.$staff['name'].'</td>';
    $table .= '<td>'.$staff['age'].'</td>';
    $table .= '<td>'.$staff['salary'].'</td>';
    $table .= '</tr>';
}

$table .= '</table>';
$num = '<p style = "text-align:center">共计:<span style="color:purple">'.count($result).'</span> 条记录</p>';
echo $table,$num;

运行实例 »

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


QQ截图20180905162001.png


后期静态绑定的原理与使用场景分析

引入后期静态绑定的目的是:用于在继承范围内引用静态调用的类。
所以, 可以用后期静态绑定的办法解决单例继承问题。


Correction status:Uncorrected

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