后期静态绑定与类的深入应用
主要知识点
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中的数据库链式操作,减少了自己对该框架的源码阅读的阻碍。同时初步认识后期静态绑定的用法