批改状态:合格
老师批语:
链式调用简介:
链式调用是每个函数最后都返回$this获取当前对象实例,从而实现多次循环引用下一个方法;
如下面这个:
<?php
class Query
{
public $table;
public $field;
public $limit;
public function table($table)
{
$this->table = $table;
return $this->table;
}
public function field($field)
{
$this->field = $field;
return $this->field;
}
public function limit($limit)
{
$this->limit = $limit;
return $this->limit;
}
}
$query = new Query;
echo '<pre>';
print_r ($query->table('list'));
echo '<hr>';
print_r ($query->field('name1,name2'));
echo '<hr>';
print_r ($query->limit(10));
echo '<hr>';
//若想转为数组
$arr=[];
$arr['table'] = $query->table('list');
$arr['field'] = $query->table('name1,name2');
$arr['limit'] = $query->table(10);
print_r ($arr);
?>可以用链式调用写为:
<?php
class Query
{
public $table;
public $field;
public $limit;
public function table($table)
{
$this->table = $table;
return $this;
}
public function field($field)
{
$this->field = $field;
return $this;
}
public function limit($limit)
{
$this->limit = $limit;
return $this;
}
}
$query = new Query;
echo '<pre>';
print_r ($query->table('list')->field('name1,name2')->limit('10'));
?>链式调用+事件委托实现数据库查询构造器
//被委托的类
class Query
{
//创建类的唯一实例 pdo对象
private static $db;//PDO实例
protected $table;//表
protected $field;//字段
protected $limit;//限制行数
//把__construct()限制为私有的 组织此类在外部进行实例化
private function __construct()
{
}
//创建静态连接方法
public static function connect($dsn,$username,$pwd)
{
//创建PDO类的唯一实例 pdo对象
if(is_null(static::$db))
{
static::$db = new PDO($dsn,$username,$pwd);
}
//返回query实例
return new static();
}
//设置一个table方法给$table属性赋值,并返回当前对象$this;
public function table($table)
{
$this->table = $table;
return $this;
}
//设置一个field方法给$field属性赋值,并返回当前对象$this;
public function field($field)
{
$this->field = $field;
return $this;
}
//设置一个limit方法给$limit属性赋值,并返回当前对象$this;
public function limit($limit)
{
$this->limit = $limit;
return $this;
}
//设置一个getSql拼接一条查询sql语句并返回
public function getSql()
{
//返回格式化的结果
return sprintf("SELECT %s FROM %s LIMIT %d",$this->field,$this->table,$this->limit);
}
//设置一个select查询方法,返回一个静态调用pdo对象用query方法处理方法,以关联数组的方式取结果集
public function select()
{
return static::$db->query($this->getSql())->fetchALL(PDO::FETCH_ASSOC);
}
}
//模型类
class Db
{
//方法拦截器去拦截方法委托给Query类执行
static function __callStatic($method,$args)
{
//设置数据库链接必要参数
$dsn = 'mysql:host=localhost;dbname=test';//localhost本地或域名或IP,test数据库名名称
$username = 'root';//账号
$pwd = 'root';//密码
//获取到被委托的类query实例
$query = Query::connect($dsn,$username,$pwd);
//返回回调函数将方法给到query中执行
return call_user_func([$query,$method],...$args);
}
}
//链式调用 逐个传参 最后给到select方法,赋值给变量
$res = Db::table('cate')->field('catname,catid')->limit(5)->select();
//输出$res
echo '<pre>';
print_r($res);点击 "运行实例" 按钮查看在线实例
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号