博客列表 >后期静态绑定与类的深入应用_2018年09月04日

后期静态绑定与类的深入应用_2018年09月04日

theYon的博客
theYon的博客原创
2018年09月06日 22:25:30490浏览

后期静态绑定与类的深入应用
主要知识点
1)call_user_func_array():执行方法或回调函数
2)__callStatic($method, $arguments):当用户访问一个不存在或无权限的静态方法时调用

3) __call($method, $arguments): 当用户访问一个不存在或无权限的方法时调用

4)后期静态绑定


后期静态绑定的原理与使用场景分析


用到的关键字:static::

原理:存储了在上一个“非转发调用”(non-forwarding call)中的类名,

意思是当我们调用一个转发调用的静态调用时,实际调用的类是上一个非转发调用的类。

而且代码执行分二种个阶段: 前期:编译阶段, 后期:运行阶段

这种在运行阶段才确定方法的调用者的技术: 后期[运行阶段]静态绑定, 延迟静态绑定

引入后期静态绑定的目的是:用于在继承范围内引用静态调用的类,

所以, 可以用后期静态绑定的办法解决单例继承问题。



代码

Query.php

<?php

class Query
{
    // 初始化数据库连接对象
    private $db = null;
    // 查询字段
    private $sql = [];
    // 连接数据库
    public function __construct()
    {
        $this->db = new PDO('mysql:host=127.0.0.1;dbname=php','root','root');
    }
    // table表名
    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 = $this->db->prepare($sql);
        $stmt->execute();
        return $stmt->fetchAll(PDO::FETCH_ASSOC);
        // return $sql;
    }
}

demo2.php

<?php

require 'Query.php';

class Db
{
    public static function __callStatic($name,$arguments)
    {
        // call_user_func_array([对象/类名, '方法'],[参数数组])
        return call_user_func_array([(new Query()),$name],$arguments);
    }
}

$result = Db::table('staff')
            ->fields('staff_id,name,salary')
            ->where('age < 25')
            ->select();

var_dump($result);

运行结果

微信截图_20180906212817.png

总结

        通过对模拟ThinkPHP5.1中的数据库链式操作,减少了自己对该框架的源码阅读的阻碍。同时初步认识后期静态绑定的用法

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