Correction status:Uncorrected
Teacher's comments:
通过静态魔术方法进行跳转,实现对象方法的跨类调用 __callStatic:
demo1.php代码:
<?php //使用静态方法的重载技术, 实现一个数据库访问类,并实例演示链接调用的实现过程 require 'Query1.php'; class Db { //创建一个私有的静态属性,用于数据库连接 protected static $pdo = null; // 数据库连接方法, 每次查询时再连接, 实现真正的惰性连接,节省系统开销 public static function connection() { //连接数据的参数 self::$pdo = new PDO('mysql:host=127.0.0.1;dbname=php','root','root'); } //查询类操作入口,通过静态魔术方法进行跳转,实现对象方法的跨类调用 public static function __callStatic($name, $arguments) { //创建pdo对象,并连接数据库 self::connection(); //实例化查询类,将连接对象作为参数 $query = new Query(self::$pdo); //执行查询类Query中的对象方法,注意参数是数组,我只需要第一个参数:表名, 所以加了索引键名 return call_user_func_array([$query,$name],[$arguments[0]]); } } //客户端的链式调用 //以Db类做入整数数据库操作的入口,SQL语句的各个部分用对象方法提供 //链式操作是现代PHP框架的基础,非常有用 $cats = Db::table('category') ->field('cate_id, name ,alias') ->where('cate_id >= 2') ->limit('2') ->select(); //foreach循环查看获取的数据库数据 foreach ($cats as $cat) { print_r($cat); echo '<br>'; } //$cats = Db::table('category') // ->field('kr,抗日神剧') // ->value('1') // ->update(); // //foreach ($cats as $cat) { // print_r($cat); // echo '<br>'; //}
点击 "运行实例" 按钮查看在线实例
Query.php代码:
<?php //数据库查询类 class Query { //连接对象 public $pdo = null; //字段列表 public $field = ''; //数据表名 public $table = ''; //查询条件 public $where = ''; //显示数量 public $limit = ''; //修改值 public $value = ''; //构造方法,初始化连接对象 public function __construct(PDO $pdo) { //连接对象是对象方法的共享属性 $this->pdo = $pdo; } //调用表名 public function table($tableName) { $this->table = $tableName; //返回当前对象,便于链式调用该对象的其他方法 return $this; } //设置查询字段 public function field($fields) { $this->field = $fields; return $this; } //设置查询条件 public function where($where) { $this->where = $where; return $this; } //设置显示数量 public function limit($limit) { $this->limit = $limit; return $this; } //设置值 public function value($value) { $this->limit = $value; return $this; } //创建SQL查询语句对象,并返回查询结果 public function select() { //查询条件设置,确保链式方法独立 $fields = empty($this->field) ? '*' : $this->field; $where = empty($this->where) ? '' : ' WHERE ' .$this->where; $limit = empty($this->limit) ? '' : ' LIMIT ' . $this->limit; //SQL查询语句 $sql = 'SELECT '.$fields.' FROM '.$this->table . $where . $limit; //预处理查询 $stmt = $this->pdo->prepare($sql); $stmt->execute(); return $stmt->fetchAll(PDO::FETCH_ASSOC); } // //创建SQL修改语句对象,并返回修改结果结果 // public function update() // { // //查询条件设置,确保链式方法独立 // $fields = empty($this->field) ? '*' : $this->field; // $where = empty($this->where) ? '' : ' WHERE ' .$this->where; // $value = empty($this->value) ? '' : '='.$this->value; // // //SQL查询语句 // $sql = 'UPDATE '.$this->table.' SET '.$fields.$value. $where; // // //预处理查询 // $stmt = $this->pdo->prepare($sql); // $stmt->execute(); // return $stmt->fetch(PDO::FETCH_ASSOC); // } }
点击 "运行实例" 按钮查看在线实例
最终在页面上打印出的数据库查询结果显示: