Blogger Information
Blog 55
fans 0
comment 0
visits 50488
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
PHP-call_user_func_arry()用法与模拟TP5链式查询-0904
Bean_sproul
Original
644 people have browsed it

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



Correction status:qualified

Teacher's comments:
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post