批改状态:合格
老师批语:
后期静态绑定与类的深入应用
主要知识点
1)call_user_func_array():执行方法或回调函数
2)__callStatic($method, $arguments):当用户访问一个不存在或无权限的静态方法时调用
3) __call($method, $arguments): 当用户访问一个不存在或无权限的方法时调用
4)后期静态绑定
后期静态绑定的原理与使用场景分析
用到的关键字:static::
原理:存储了在上一个“非转发调用”(non-forwarding call)中的类名,
意思是当我们调用一个转发调用的静态调用时,实际调用的类是上一个非转发调用的类。
而且代码执行分二种个阶段: 前期:编译阶段, 后期:运行阶段
这种在运行阶段才确定方法的调用者的技术: 后期[运行阶段]静态绑定, 延迟静态绑定
引入后期静态绑定的目的是:用于在继承范围内引用静态调用的类,
所以, 可以用后期静态绑定的办法解决单例继承问题。
代码
Query.php
<?php
class Query
{
// 初始化数据库连接对象
private $db = null;
// 查询字段
private $sql = [];
// 连接数据库
public function __construct()
{
$this->db = new PDO('mysql:host=127.0.0.1;dbname=php','root','root');
}
// table表名
public function table($table)
{
$this->sql['table'] = $table;
return $this;
}
// 输出内容
public function fields($fields)
{
$this->sql['fields'] = $fields;
return $this;
}
// 查询条件
public function where($where)
{
$this->sql['where'] = $where;
return $this;
}
// 查询语句
public function select()
{
$sql = "SELECT {$this->sql['fields']} FROM {$this->sql['table']} WHERE {$this->sql['where']} ";
$stmt = $this->db->prepare($sql);
$stmt->execute();
return $stmt->fetchAll(PDO::FETCH_ASSOC);
// return $sql;
}
}demo2.php
<?php
require 'Query.php';
class Db
{
public static function __callStatic($name,$arguments)
{
// call_user_func_array([对象/类名, '方法'],[参数数组])
return call_user_func_array([(new Query()),$name],$arguments);
}
}
$result = Db::table('staff')
->fields('staff_id,name,salary')
->where('age < 25')
->select();
var_dump($result);运行结果

总结
通过对模拟ThinkPHP5.1中的数据库链式操作,减少了自己对该框架的源码阅读的阻碍。同时初步认识后期静态绑定的用法
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号