链式调用简介:
链式调用是每个函数最后都返回$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);
运行实例 »
点击 "运行实例" 按钮查看在线实例