Blogger Information
Blog 28
fans 0
comment 0
visits 26726
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
模拟TP框架的链式查询与静态绑定原理
YHF的博客
Original
1008 people have browsed it

模拟TP框架的链式查询:

demo.php:

实例

<?php
/**
 * 方法重载的实战案例:模拟ThinkPhp5.1中的数据库链式操作
 * 用方法重载实现方法跨类调用
*/

//Db::table()->fields()->where()->select();

require 'Query.php';
class Db{
    public static function __callStatic($name,$values){
        //call_user_func_array([类名,方法],[值(参数)])
        //call_user_func_array([对象,方法],[])
        return call_user_func_array([(new Query()),$name],$values);
    }
}
$result= Db::table('user')
    ->fields('id,name,salary')
    ->where('salary>5000')
    ->select();

//print_r($result);
// 用表格将查询结果格式化输出
$table = '<table border="1" cellpadding="5" cellspacing="0" width="60%" align="center">';
$table .= '<caption style="font-size: 1.5rem;margin:15px;">员工信息表</caption>';
$table .= '<tr bgcolor="#90ee90"><th>ID</th><th>姓名</th><th>工资</th></tr>';

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

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

运行实例 »

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

Query.php

实例

<?php
/**
 * 数据库查询类
 */
class Query{
    //保存sql语句中的各个组成部分
    //select字段列表 from 表名 where 条件
    private $sql=[];
    //数据库连接对象
    private $pdo=null;
    //构造方法:连接数据库
    public function __construct()
    {
        //连接数据库并返回对象
        $this->pdo=new PDO('mysql:host=127.0.0.1;dbname=test','root','');
    }
    public function table($table){
        //table()获取sql语句的表名
        $this->sql['table']=$table;
        return $this;//返回当前类实例对象,便于链式调用该对象的其他方法
    }
    public function fields($fields){
        //fields()获取sql语句的字段列表
        $this->sql['fields']=$fields;
        return $this;
    }
    public function where($where){
        //where()获取sql语句的查询条件
        $this->sql['where']=$where;
        return $this;
    }
    //执行查询,所谓的终极方法
    public function select(){
        //拼装select查询语句
        $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);

    }
}

运行实例 »

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

demo3.jpg

二.问答:

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

1.后期静态绑定工作原理

原理:存储了在上一个“非转发调用”(non-forwarding call)中的类名。意思是当我们调用一个转发调用的静态调用时,实际调用的类是上一个非转发调用的类。

2.使用场景

用于在继承范围内引用静态调用的类,使用static可以解决self时出现的单例继承问题。

总结:

  1. 链式结构需要在每个方法return $this;

  2. call_user_func_array([类名,方法],[值(参数)])
            call_user_func_array([对象,方法],[])

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