博客列表 >PHP-call_user_func_arry()用法与模拟TP5链式查询-0904

PHP-call_user_func_arry()用法与模拟TP5链式查询-0904

Bean_sproul
Bean_sproul原创
2018年09月13日 14:47:20643浏览

PHP的回调函数 :call_user_func_array([对象,方法],[数组])


实例

<?php
/**
 * call_user_func_array():执行方法或回调函数
 * call_user_func_array(函数/方法[, 参数数组])
 */

//call_user_func_array()的使用场景:
//场景一: 执行回调函数
// 计算二个整数之和
echo call_user_func_array(function($m,$n){return $m+$n;},[10,20]),'<hr>';

//场景二: 执行对象方法
class Hello1
{
    public function add($m, $n)
    {
        return $m + $n;
    }
}
//call_user_func_array([对象, '方法'],[参数数组])
//$obj = new Hello1();
//$method = 'add';
//$args = [30, 50];
//echo call_user_func_array([$obj, $method],$args), '<hr>';
//可以简写:
echo call_user_func_array([(new Hello1()), 'add'],[35,50]),'<hr>';

//场景三: 执行类中的静态方法
class Hello2
{
    public static function add($m, $n)
    {
        return $m + $n;
    }
}

//Hello2::add()
echo call_user_func_array(['Hello2','add'],[40,60]),'<hr>';

运行实例 »

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


模拟TP5链式查询

数据库查询类Query


实例

<?php

//数据库查询类
class Query
{
    //保存sql语句中的各个组成部分
    // SELECT 字段列表 FROM 表名 WHERE 条件
    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()获取sql中查询条件
    public function where($where)
    {
        $this->sql['where']=$where; //指定查询表名
        return $this;  //返回当前类实例对象,便于链式调用该对象的其它方法->
    }
   //执行查询,是一个终级方法
    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);//解析获取常量
    }
}

运行实例 »

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


数据库操作的入口类DB


实例

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

//Db::table()->fields()->where()->select();
//加载Query类
require 'php2.php';

// 数据库操作的入口类
class Db
{
    public static function __callStatic($name, $arguments)
    {
        //call_user_func_array([类名, 方法],[])
        //call_user_func_array([对象, 方法],[])
        return call_user_func_array([(new Query()),$name],$arguments);
    }
}

$result = Db::table('news')
        ->fields('id,name,age,money')
        ->where('money > 2000')
        ->select();
//print_r($result);测试打印看看是否有数据

$table = '<table border="1" cellpadding=5px cellspacing=0 width=60% align=center>';
$table .= '<caption style="font-size: 1.5rem;margin:15px;">员工信息表</caption>';
$table .= '<tr bgcolor="#90ee90"><th>ID</th><th>姓名</th><th>年龄</th><th>工资</th></tr>';

foreach ($result as $staff) {
    $table .= '<tr align="center">';
    $table .= '<td>'.$staff['id'].'</td>';
    $table .= '<td>'.$staff['name'].'</td>';
    $table .= '<td>'.$staff['age'].'</td>';
    $table .= '<td>'.$staff['money'].'</td>';
    $table .= '</tr>';
}

$table .= '</table>';
$num = '<p style="text-align: center"> 共计:  <span style="color:red">'.count($result).'</span>   条记录</p>';
echo $table, $num;

运行实例 »

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

QQ截图20180913144413.png



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