【转】PHP实现连贯操作
2016-03-16 11:44
507 查看
【第一种方案 __call】
我们在使用一些框架(如ThinkPHP)编码的时候,常用到这样的代码。
这样不仅有利于编码,而且也能让人"心情愉悦"呢。好了,不多说了。让我们看看如何实现的吧?
原文出处http://www.gwalker.cn/article-163.html
【第二种方案 不使用__call】
下面写的这个例子,则不是用_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里灵活的应用
- ThinkPHP-微信支付案例
- php分享三十四:待排查问题
- PHP匿名函数和use子句用法实例
- smarty缓存原理讲解(php缓存篇)
- 设置RobotFramework的ftplibrary中,将Upload_file操作的异常改为回显错误信息。
- php的几种运行模式CLI、CGI、FastCGI、mod_php
- PHP实现java中的DatainputStream类
- PHP Static延迟静态绑定用法分析
- 输入输出流getOutputStream() has already been called for this response问题的解决办法
- 在非集成环境下安装yii2
- PHP中的魔术方法
- context.getClass和getPackageName的区别
- ftp目录赋予用户权限
- PHP5.5迭代生成器用法实例详解
- sysbench 0.5 oltp测试笔记
- php strtotime函数服务器和本地不相同
- php中ereg() ,preg_match() 有啥区别?
- Laravel执行migrate命令提示:No such file or directory的解决方法
- Ubuntu下MTP设备的挂载目录