转PHP实现连贯操作
Posted YunGaZeon
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了转PHP实现连贯操作相关的知识,希望对你有一定的参考价值。
【第一种方案 __call】
我们在使用一些框架(如Thinkphp)编码的时候,常用到这样的代码。
M(‘User‘)->where(array(‘id‘=>1))->field(‘name‘)->select();
这样不仅有利于编码,而且也能让人"心情愉悦"呢。好了,不多说了。让我们看看如何实现的吧?
<?php //数据库操作基类[PS:主要功能连贯功能实现] class Db{ //此属性定义要实现连贯操作的方法名 public $sql = array( "field" => "", "where" => "", "order" => "", "limit" => "", "group" => "", "having" => "", ); /** * 连贯操作时,调用field() where() order() limit() group() having()方法且组合成sql语句 * 此方法为PHP魔术方法,调用类中不存在的方法时就会自动调用此方法 * @param $methodName 调用不存在的方法时,接收这个方法名称的字符串 * @param $args 调用不存在的方法时,接收这个方法的参数,以数组形式接收 */ function __call($methodName,$args){ //把要请求的方法名,统一转为小写 $methodName=strtolower($methodName); //若请求方法名与成员属性数组$sql下标对应上;则将第二个参数,赋值给数组中"下标对应的元素" if(isset($this->sql[$methodName])){ $this->sql[$methodName]=$args[0]; }else{ echo ‘调用类‘.get_class($this).‘中的‘.$methodName.‘()方法不存在‘; } //返回对象;从而可以继续调用本对象中的方法,形成连贯操作 return $this; } /** * 用此方法拼接成一个select的sql语句;[PS:此方法终结了连贯操作,置于连贯操作的最后面] */ function select(){ //按照select语法拼接sql字符串[PS:可以在mysql命令行中执行"help select;"查看其语法构结] $sql="SELECT {$this->sql[‘field‘]} FROM test {$this->sql[‘where‘]} {$this->sql[‘group‘]} {$this->sql[‘having‘]} {$this->sql[‘order‘]} {$this->sql[‘limit‘]}"; echo $sql; } } $obj=new db(); $obj->field(‘name,sex,address‘)->where(‘where name="gongwen"‘)->limit(‘limit 1‘)->select(); //输出:SELECT name,sex,address FROM test where name=gongwen limit 1
原文出处http://www.gwalker.cn/article-163.html
【第二种方案 不使用__call】
下面写的这个例子,则不是用_call的,大家可以扩展一下吧。
/* * SQL语句组合实例类,始发文章web开发笔记 * 学习用,非专业类 * */ class sql{ private $sql=array("from"=>"", "where"=>"", "order"=>"", "limit"=>""); public function from($tableName) { $this->sql["from"]="FROM ".$tableName; return $this; } public function where($_where=‘1=1‘) { $this->sql["where"]="WHERE ".$_where; return $this; } public function order($_order=‘id DESC‘) { $this->sql["order"]="ORDER BY ".$_order; return $this; } public function limit($_limit=‘30‘) { $this->sql["limit"]="LIMIT 0,".$_limit; return $this; } public function select($_select=‘*‘) { return "SELECT ".$_select." ".(implode(" ",$this->sql)); } } $sql =new sql(); echo $sql->from("testTable")->where("id=1")->order("id DESC")->limit(10)->select(); //输出 SELECT * FROM testTable WHERE id=1 ORDER BY id DESC LIMIT 0,10
摘自脚本之家,原作者不详。
以上是关于转PHP实现连贯操作的主要内容,如果未能解决你的问题,请参考以下文章