博客列表 >方法重载原理/call_user_func_array/TP框架的链式查询/后期静态绑定—2018年9月7日01时50分

方法重载原理/call_user_func_array/TP框架的链式查询/后期静态绑定—2018年9月7日01时50分

耗子的博客
耗子的博客原创
2018年09月07日 01:53:38864浏览

本课程学习:

方法重载原理

call_user_func_array

TP框架的链式查询

后期静态绑定

实例

<?php
/**
 * 实战案例:
 * 方法重载的实例:模拟TP5.1中的链式操作
 *
 * 用方法重载实现方法跨类调用
 */

require 'Query.php';

class  Db
{


    public  static function  __callStatic($name, $arguments)
    {
//        $ages=implode(',',$arguments);//自动拆分数组以,分开
//        return '当前访问的方法是:'.__METHOD__.'调用的方法是:'.$name.'传入的参数是:'.$arguments;

        return call_user_func_array([(new query()),$name],$arguments);

    }

}

 $result=Db::Table('user')
     ->fields('id,user,name,salary')//测试时犯错注意这里输出的字段并不是以数值的方式
     ->where('id<50')
     ->select();

//echo '<pre>';
//var_dump($result);

//将数据以表格的方式输出

$table='<table border="1" cellpadding="5" cellspacing="0" width="80%" align="center">';
$table.='<caption style="font-size: 16px;margin: 20px"><h2>员工信息表</h2></caption>';
$table.='<tr style="background: lightskyblue"><th>ID</th><th>用户</th><th>名称</th><th>工资</th></th></tr>';
foreach ($result as $user)
{
    $table.='<tr style="text-align: center">';
    $table.='<td>'.$user['id'].'</td>';
    $table.='<td>'.$user['user'].'</td>';
    $table.='<td>'.$user['name'].'</td>';
    $table.='<td>'.$user['salary'].'</td>';
}
$table.='</table>';

$num='<p style="text-align: center">当前数据的总行数为:<span style="color: red">'.count($result).'</span>'.'条记录</p>';

echo  $table;
echo $num;

运行实例 »

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

实例

<?php

class query
{


    //保存sql语句的各个组成部分
    private $sql=[];

    //数据库连接对象
    private  $pdo=null;

    //构造方法:连接数据库
    public function __construct()
    {
        $this->pdo=new PDO('mysql:host=127.0.0.1;dbname=php','root','root');

    }

    //table()获取SQL语句的表名
    public  function  table($table)
    {
        $this->sql['table']=$table;
        return $this;
        //返回当前实例对象,便于链式调用该对象的方法
    }

    //fields()获取sql语句的字段列表
    public function fields($fields)
    {
        $this->sql['fields']=$fields;
        return $this;
    }

    //where()
    public  function  where($where)
    {
        $this->sql['where']=$where;
        return $this;
    }

    //select()
    public function  select()
    {
        //拼装SELECT 查询语句
        $sql="SELECT {$this->sql['fields']} FROM {$this->sql['table']} WHERE {$this->sql['where']}";
        $stmt=$this->pdo->prepare($sql);
        $stmt->execute();
        return $stmt->fetchAll(PDO::FETCH_ASSOC);

    }
}

运行实例 »

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



2. 问答: 后期静态绑定的原理与使用场景分析

通过静态继承后,始终指向调用的上下文环境

后期静态绑定:静态继承的上下文环境,用于动态设置静态方法的调用者

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

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



总结:

* 方法重载的实战,call_user_func_array()  执行方法或回调函数

* 参数:2个, 执行回调函数call_user_func_array(函数,[参数数组])
* 参数:2个数组  执行对象方法 call_user_func_array([对象,方法],[数组])
* 参数:2个数组  执行类中静态方法 call_user_func_array(['类','方法'],[数组])

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