博客列表 >利用重载方法模拟tp框架的链式调用以及后期静态绑定的总结——2018年9月4日

利用重载方法模拟tp框架的链式调用以及后期静态绑定的总结——2018年9月4日

Jackson
Jackson原创
2018年09月14日 16:19:52566浏览

1.链式调用

使用重载方法和call_user_func_array()来模拟tp框架的链式调用。个人认为链式调用其实就是每个方法执行相应的数据操作然后返回当前对象。代码如下:

实例

//Db::table()->fields()->where()->select()

class Query{
    protected static $pdo = null;
    //连接数据库的参数
    private $data = [
        'type' => 'mysql',
        'host' => 'localhost',
        'dbname' => 'php',
        'user' => 'root',
        'pass' => 'root'
    ];
    //保存sql语句中的各个部分
    private $sql = [];
    //构造器 连接数据库
    public function __construct()
    {
        $dsn = $this->data['type'].':host='.$this->data['host'].';dbname='.$this->data['dbname'];
        $user = $this->data['user'];
        $pass = $this->data['pass'];
        self::$pdo =new PDO($dsn,$user,$pass);
        self::$pdo->query('set names utf8');
    }
    //设置表名
    public function table($table){
        $this->sql['table'] = $table;
        return $this;//返回当前对象
    }
    //设置字段名
    public function fields($fields){
        $this->sql['fields'] = $fields;
        return $this;
    }
    //设置条件
    public function where($where){
        $this->sql['where'] = $where;
        return $this;
    }
    //查询操作
    public function select(){
        $sql = "SELECT {$this->sql['fields']} FROM {$this->sql['table']} WHERE {$this->sql['where']};";
        $stmt = self::$pdo->prepare($sql); //创建预处理对象
        $stmt->execute();//执行语句
        return $stmt->fetchAll(PDO::FETCH_ASSOC);//返回结果集
    }
}

class Db{
    public static function __callstatic($name, $arguments){
        //调用query的成员方法
        return call_user_func_array([new Query(), $name], $arguments);
//       return (new query())->$name($arguments[0]);
    }
}

//获取查询结果

$where = 'salary>'.$_GET['salary'];
$res = Db::table('staff')->fields('staff_id,name,salary')->where($where)->select();
$table = '<form action="" method="get"><h3 align="center">工资大于:<input type="text" name="salary" value=""> <button>提交</button></h3></form>';
$table .= '<table  border="1" align="center" cellpadding="5px" cellspacing="0" width="30%"><caption style="font-size: 1.5rem;margin: 5px">员工信息表</caption>';
$table .= '<tr align="center" bgcolor="#87ceeb"><th>id</th><th>姓名</th><th>工资</th>';
foreach ($res as $staff){
    $table .= "<tr align='center'><td>{$staff['staff_id']}</td>";
    $table .= "<td>{$staff['name']}</td>";
    $table .= "<td>{$staff['salary']}</td></tr>";
}
$table .= '</table>';
echo $table;
运行实例 »

点击 "运行实例" 按钮查看在线实例


2.后期静态绑定

原理:后期就是代码的运行过程中,而前期就是代码编写过程。后期静态绑定是为了静态继承中能够动态设置静态方法的调用者。使用static作为伪变量而不是self,self只是绑定当前的类,并不能识别出子类的的调用,而static就可以识别出调用者,从而可以调用子类的方法而不是父类的方法

使用场景:在静态继承中,子类重写了父类的静态方法时,需要调用子类的静态方法时就要使用static这个为变量。


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