标题:php __call()方法实现数据库连贯操作 出处:向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除 时间:Tue, 08 Mar 2016 11:11:43 +0000 作者:jackxiang 地址:http://jackxiang.com/post/8553/ 内容: 背景:对的jquery有一种叫链式操作的dom的,而PHP在写sql时也可以使用类似的方法,如: /** * 从数据库获得用户分页专辑记录 * * @param str|array $where 查询条件 * @param int $page 当前页 * @param int $perpage 每页显示的记录数 * @param str $order 排序类型 * @param str $asc 升序/降序 * @return array 满足条件的记录 */ public function getUsersAlbumFromDB($where, $page, $perpage, $order, $asc) { $offset = ($page - 1) * $perpage; $dataList = $this->getSelectObj() ->where($where) ->order($order, $asc) ->limit($perpage, $offset) ->fetchObject(); return $dataList; } 这种写法有点类似Jquery的链式写法,如下: $ (this).find ("div").css ("background", "red").end().siblings ().find ("div").css ("background", "green"); __call函数相关介绍:http://jackxiang.com/post/2834/ ================================================= 使用__call()方法来实现数据库连贯操作 "", "where" => "", "order" => "", "limit" => "", "group" => "", "having" => "", ); // 连贯操作调用field() where() order() limit() group() having()方法,组合sql语句 function __call($methodName,$args){ // 将第一个参数(代表不存在方法的方法名称),全部转成小写方式,获取方法名称 $methodName = strtolower($methodName); // 如果调用的方法名和成员属性数组$sql下标对应上,则将第二个参数给数组中下标对应的元素 if(array_key_exists($methodName,$this->sql)){ $this->sql[$methodName] = $args[0]; }else{ echo '调用类'.get_class($this).'中的方法'.$methodName.'()不存在'; } // 返回自己对象,则可以继续调用本对象中的方法,形成连贯操作 return $this; } // 输出连贯操作后组合的一个sql语句,是连贯操作最后的一个方法 function select(){ echo "SELECT {$this->sql['field']} FROM user {$this->sql['where']} {$this->sql['order']} {$this->sql['limit']} {$this->sql['group']} {$this->sql['having']}"; } } $db = new Db(); // 连贯操作 $db->field('sex, count(sex)') ->where('where sex in ("男","女")') ->group('group by sex') ->having('having avg(age) > 25') ->select(); ?> ---------- 调试PHP ---------- SELECT sex, count(sex) FROM user where sex in ("男","女") group by sex having avg(age) > 25 Output completed (0 sec consumed) - Normal Termination 来自:http://blog.sina.com.cn/s/blog_6109978501017154.html Generated by Jackxiang's Bo-blog 2.1.1 Release