博客列表 >【9/4】--方法的重载与call_user_funce_array对于方法重载的应用以及模拟TP5.1的框架链式查询

【9/4】--方法的重载与call_user_funce_array对于方法重载的应用以及模拟TP5.1的框架链式查询

花弄的博客
花弄的博客原创
2018年09月06日 17:48:371223浏览

对于框架的链式查询的模拟如下.   首先是需要一个数据操作的入口类:在内部通过调用call_user_func_array方法来实现对数据操作类的链式调用.

实例

 * 用方法重载实现方法跨类调用
 */

//数据库操作的入口类
/**
 * 
 */

require 'Query.php';
class DB
{
	public static function __callStatic($name,$arguments)
	{
		return call_user_func_array([(new Query()),$name],$arguments);
	}
}

$result = DB::table('user')
			->field('id,username,sex,phone')
			->where('id > 7')
			->select();

以上的table,field,where,select就是相应的链式的组成sql的查询的方法.

具体方法如下:

实例

<?php

/**
 * 数据库查询类
 */


class Query
{
	//保存sql语句中的各个组成部分
	//selsect 字段列表 from 表名 where 条件
	private $sql = [];

	//数据库连接对象
	private $pdo = null;

	//构造方法,连接数据库
	public function __construct()
	{
		//连接数据库并返回pdo对象
		$this->pdo = new PDO('mysql:host=127.0.0.1;dbname=pdotest','root','root');
	}

	//table() 获取sql语句的表名
	public function table($table)
	{
		$this->sql['table'] = $table;
		return $this;
	}

	//获取sql语句的字段列表
	public function field($field)
	{
		$this->sql['field'] = $field;
		return $this;
	}

	//获取sql语句的条件
	public function where($where)
	{
		$this->sql['where'] = $where;
		return $this;
	}

	//查询,终极方法
	public function select()
	{
		//拼接sql查询语句
		$sql = "SELECT {$this->sql['field']} FROM {$this->sql['table']} WHERE {$this->sql['where']}";
		$stmt = $this->pdo->prepare($sql);
		$stmt->execute();
		print_r($sql);
		return $stmt->fetchALL(PDO::FETCH_ASSOC);
	}

}


通过一层一层的链式往下级的调用来组成整个sql的查询过程.而且方法的调用是不分顺序的,只要保证终极方法在最后即可.得到结果集后直接输出即可.可以说是一次编写,多次复用了,虽然第一次写看起来是有点麻烦,但是相对于每次查询都写一次的过程式程序来说,这个已经实现绝大多数的数据查询的代码复用.

具体的执行的结果如下:

res.jpg


声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议