Blogger Information
Blog 39
fans 0
comment 0
visits 30860
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
普通与静态的方法重载示例,使用call_user_func_array()模拟TP框架的链式查询 2018年9月4日 22:01
南通税企通马主任的博客
Original
785 people have browsed it

编程一、普通(动态)与静态方法重载示例

实例

<?php
header("content-Type:text/html;charset=UTF-8");
echo '<h1>普通与静态方法重载示例</h1><hr>';

//1,用__call()方法进行重载

class Task1{
//    普通
    public function __call($name, $arguments)
    {
        $args = implode(',',$arguments);
        return '方法名:'.$name.'<br>参数:'.$args;
    }
    private function select()
    {
        return __METHOD__;
    }
//    静态
    public static function __callStatic($name, $arguments)
    {
        $args = implode(',',$arguments);
        return '方法名:'.$name.'<br>参数:'.$args;
    }

}
$task1 = new Task1;
//访问一个不存在的方法
echo $task1 ->show('南通','合肥','上海'),'<hr>';

//访问私有属性方法时,只要存在魔术方法__call()方法,将自动回调私有属性方法
echo $task1 ->select('staff','id,name,age'),'<hr>';

//访问一个不存在的静态方法
echo Task1::keys('php','mysql','html5','css');

运行实例 »

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


编程二、使用call_user_func_array()模拟TP框架的链式查询

实例

<?php
header("content-Type:text/html;charset=UTF-8");
echo '<h1>数据库查询类</h1><hr>';

class Sql{
//    1,sql语句中的各个组成部分用一个私有属性保存起来
    private $sql = [];

//    2,建议数据库连接对象pdo
    private $pdo = null;

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

//    4,用table()方法获取sql语句的表名
    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()
    {
//        拼装selsct查询语句
        $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);
    }
    
}

实例

<?php
header("content-Type:text/html;charset=UTF-8");
echo '<h1>使用call_user_func_array()模拟TP框架的链式查询</h1><hr>';

require 'Sql.php';

//用方法重载的方式实现跨类调用!
class Maya{
    public static function __callStatic($name, $arguments)
    {
        return call_user_func_array([(new Sql()),$name],$arguments);
    }

}
    $res = Maya::table('staff')
               ->fields('id,name,age,salary')
               ->where('salary > 2000')
               ->select();

//print_r($res);
//ok,最后一步,高逼格表格化输出
$table = '<table border="1" cellpadding="5" cellspacing="0" width="60%" align="center">';
$table .= '<caption style="font-size: 1.5rem;margin:15px;">员工信息表</caption>';
$table .= '<tr bgcolor="#adff2f"><th>ID</th><th>姓名</th><th>年龄</th><th>工资</th></tr>';

foreach ($res as $staff){
    $table .= '<tr align="center">';
    $table .= '<td>'.$staff['id'].'</td>';
    $table .= '<td>'.$staff['name'].'</td>';
    $table .= '<td>'.$staff['age'].'</td>';
    $table .= '<td>'.$staff['salary'].'</td>';
    $table .= '</tr>';
}
$table .= '</table>';
$num = '<p style="text-align: center">共计:<span style="color:red;">'.count($res).'条记录'.'</span></p>';

echo $table,$num;

运行实例 »

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


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

首先,后期静态绑定中后期的意思是运行阶段中的意思,也称为延迟绑定;

很简单,你在处理业务逻辑的时候,是不可能一竿子打到底的,中间很有可能需要边做边调试,

我们将整个的过程大致上分为编译阶段和运行阶段两个不同的阶段;

那么在运行阶段的调试过程中,才会根据逻辑的需要来调整静态继承的绑定;

总结一句话:静态继承的上下文环境,用于动态设置静态方法的调用者就称之为后期静态绑定!


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