Correction status:Uncorrected
Teacher's comments:
本篇文章主要知识点
1.方法重载和属性重载(重点)
案例内容
数据库查询的链式操作
zy01.php的内容
<?php // 注意,下面这些代码是自己敲的,但是注释是复制老师的. require 'zy02.php'; class Db { // 数据库连接对象,受保护的静态对象 protected static $pdo = null; // 数据库连接方法,每次查询时再连接, 实现真正的惰性连接,节省系统开销 public static function connection() { // 连接数据库,数据库的地址和账号密码 self::$pdo = new PDO('mysql:host=localhost;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框架的基础,非常有用 $staffs = Db::table('staff') ->field('staff_id,name,position,mobile') ->where('staff_id > 2') // = 2,只会输出一条 ->limit(5) ->select(); foreach ($staffs as $staff) { print_r($staff); echo '<br>'; }
点击 "运行实例" 按钮查看在线实例]
zy02.php文件的内容
<?php // 数据库查询类 class Query { // 连接对象 public $pdo = null; // 数据表名 public $table = ''; // 字段列表 public $field = ''; // 查询条件 public $where = ''; // 显示数量 public $limit = 0; // 构造方法,初始化连接对象 public function __construct($pdo) { // 连接对象是对象方法的共享属性 $this->pdo = $pdo; } // 调用表名 public function table($tablName) { $this->table = $tablName; // 返回当前对象,便于链式调用该对象的其它方法 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 select() { // 查询条件分开设置, 可以确保链式方法独立 // 然后判断是否为空 $fields = empty($this->fields) ? '*' : $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); } }
点击 "运行实例" 按钮查看在线实例