Blogger Information
Blog 22
fans 0
comment 0
visits 21745
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
方法重载与静态继承、静态延迟绑定(9月4日作业)
岑勋的博客
Original
791 people have browsed it

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

实例

<?php
/**
 * Query类
 */
header("Content-type: text/html; charset=utf-8");
class DbQuery
{
    //创建类型为数组的属性,保存传入的查询语句的组成部分
    private $sql = [];
    //创建数据库对象,连接数据库
    protected $pdo = null;
    public function __construct()
    {
        $dsn = 'mysql:host=127.0.0.1;dbname=php';
        $char = 'charset = utf-8';
        $user = 'root';
        $pwd = '';
        $this->pdo = new PDO($dsn,$user,$pwd);
        $this->pdo->query("set names utf8"); //解决中文乱码
    }
    //table()方法获取(保存)表名
    public function table($tb_name)
    {
        $this->sql['table'] = $tb_name;
        return $this;  //返回当前类的实例化对象,以便链式调用对象的其他方法
    }

    //fields()方法获取数据表字段列表
    public function fields($fields)
    {
        $this->sql['fields'] = $fields;
        return $this;
    }

    //where()方法获取查询条件
    public function where($where)
    {
        $this->sql['where'] = $where ;
        return $this;
    }

    //select()方法执行查询,这是终极方法
    public function select()
    {
        //拼接sql语句
        $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);

    }

}
//var_dump((new DbQuery())->table('staff')->fields('name,salary')->where('salary>5000')->select());

运行实例 »

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

实例

<?php
/*
 * Db类
 * 方法重载:method overloading
 * 实现跨类调用方法
 */
require 'DbQuery.php';

//数据库操作的统一入口类
class Db
{
    //
    public static function __callStatic($name, $arguments)
    {
        return call_user_func_array([(new DbQuery()),$name],$arguments);
//
    }

}

 $res = Db::table('staff')->fields('staff_id,name,salary')->where('salary>5000')->select();
//  var_dump($res);

$table = '<table border="1" cellspacing = "0" cellpadding="5" width="400px" align="center" style="text-align: center;">';
$table .= '<caption>员工信息</caption>';
$table .= '<tr>'.'<th>编号</th>'.'<th>姓名</th>'.'<th>工资</th>'.'</tr>';
foreach ($res as $k =>$v) {
   $table .= '<tr>';
   $table .= '<td>'.$v['staff_id'].'</td>';
    $table .= '<td>'.$v['name'].'</td>';
    $table .= '<td>'.$v['salary'].'</td>';
    $table .= '</tr>';
}

$table .= '</table>';
echo $table;
$nums = count($res);
echo '<p style="text-align: center">共计<span style="color: lightskyblue;">'.$nums.'</span>条记录</P>';

运行实例 »

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

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

在父类中定义一个静态方法,这个方法用self调用父类的属性或方法,当子类重写并调用这个静态方法时,执行的不是子类重写的方法,而是取决于定义当前静态方法所在的类(父类),这不是子类希望的,子类本来是要调用自己重写的静态方法。父类中的self只认父类自己,不认子类。所以要把当前方法和调用者绑定,使用static关键字,不再用self。static 随调用者而变化,始终指向静态方法的调用者。因为代码执行分二个阶段: 前期是编译阶段(确定数据及各种关系), 后期是运行阶段。这种在运行阶段才动态确定(计算)方法的调用者的技术就叫后期静态绑定, 或叫延迟静态绑定。


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