本篇文章主要知识点
1.方法重载和属性重载(重点)
案例内容
数据库查询的链式操作
zy01.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 '
';
}
运行实例 »
点击 "运行实例" 按钮查看在线实例]
zy02.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);
}
}
运行实例 »
点击 "运行实例" 按钮查看在线实例