PHP链式操作原理

1)第一种方法

<?php  
   
/* 
 *类功能:实现数据库的连贯查询操作 
 */  
 class mysql_query{  
 var $tbl=’user’;//要操作的表名  
 var $limit=”;//存储limit语句的变量  
 var $order=”;//存储order语句的变量  
 var $sql=”;//存储完整sql语句的变量  
   
function limit($str) {  
 $this->limit=’limit ‘.$str;//设置limit语句  
 //返回对类自身的引用,这里不能使用return new mysql_qery(),  
 //因为这样相当于又创建了类的一个新实例,那么上一步设置的limit语句,在新实例中是不存在的  
 //大家可以自己实验  
 //因此要返回$this,即当前类的实例  
 return $this;  
}  
   
function order($str) {  
 $this->order=’order by ‘.$str;//设置order语句  
 return $this;//返回对类自身的引用  
}  
   
function findall() {  
 $this->sql=’select * from ‘.$this->tbl.’ ‘.$this->order.’ ‘.$this->limit;//拼接sql语句  
 echo $this->sql;//输出,由于是示例,所以没有写查询数据库的代码  
}  
   
 }  
   
//Example  
$mysqlDb=new mysql_query();  
$result = $mysqlDb->limit(’0,10′)->order(‘id desc’)->findall();  
print_r($result); 

2)php __call()方法实现数据库连贯操作

<?php
namespace Config;
// 使用__call()方法来实现数据库连贯操作
// 申明一个Db类(数据库操作类)的简单操作模型
class LinkAction
{
    private $sql = array(
        "field" => "",
        "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 LinkAction();

// 连贯操作  
$db->field('sex, count(sex)')
    ->where('where sex in ("男","女")')
    ->group('group by sex')
    ->having('having avg(age) > 25')
    ->select();

 

猜你喜欢

转载自www.cnblogs.com/xiaobingch/p/12464500.html