zoukankan      html  css  js  c++  java
  • php 的魔术方法__call()的应用

      php的魔术方法__call()是在访问对象中不存在的方法时会自动调用该方法,可以在该方法中给出错误提示信息反馈回调用用户。但是魔术方法__call()不只这样使用,可以实现像codeIgniter的数据库查询构造器类的“链式方法”生成sql语句。

    //codeIgniter的链式方法
    $result = $this->db
                   ->select("*")
                   ->from($this->dbTable)
                   ->where('name', $name)
                   ->where('title', $title)
                   ->order_by('title', 'DESC')
                   ->get();

    下面是用魔术方法__call()实现上面的链式方法:

    ——连贯操作

    <?php
    //声明一个DB类(数据库操作类)的简单操作模型
    class DB{
        private $sql = array(
            'field'  => '',
            'where'  => '',
            'order'  => '',
            'limit'  => '',
            'group'  => '',
            'having' => ''
        );
        
        //连贯操作调用field(),where(),order(),limit(),group(),having()方法,组合sql语句
        function __call($methodName, $arge){
            
            //将第一个参数(代表不存在方法的方法名)全部转化为小写方式,获取方法名称
            $methodName = strtolower($methodName);
            
            //如果调用的方法名和成员属性数组$sql下标相对应,则将第二个参数赋给数组中下标对应的元素
            if(array_key_exists($methodName, $this->sql)){
                $this->sql[$methodName] = $arge[0];
            }else{
                echo '<br><br>调用类' . get_class($this) . '中的方法' . $methodName . '()不存在。';
            }
            
            //返回自己的对象,则可以继续调用本对象中的方法,形成连贯操作
            return $this;
        }
        
        //简单的应用,没有实际意义,只是输出连贯操作后组合的一条sql语句,是连贯操作最后调用的一个方法
        function select(){
            echo "SELECT FROM {$this->sql['field']} user {$this->sql['where']} {$this->sql['order']} {$this->sql['limit']} {$this->sql['group']} {$this->sql['having']}";
        }
    }
    
    $db = new DB;
    
    //连贯操作,也可以分为多行连续调用多个方法
    $db->field('sex, count(sex)')
           ->where('where sex in ("男", "女")')
           ->group('group by sex')
           ->having('having avg(age) > 25')
           ->select();
    
    //如果调用的方法不存在,也会有提示,下面演示的就是调用一个不存在的方法query()
    $db->query('SELECT * FROM user');

    代码实现效果:

  • 相关阅读:
    微信小程序之----加载中提示框loading
    微信小程序之----消息提示框toast
    微信小程序之----弹框组件modal
    浅析浏览器的回流与重绘 (Reflow & Repaint)
    关于input的一些问题解决方法分享
    关于js中 toFixed()的一个小坑
    浅谈js中null和undefined的区别
    浅谈JS中的闭包
    浅谈JS中的浅拷贝与深拷贝
    css设置居中的方案总结
  • 原文地址:https://www.cnblogs.com/qingsong/p/13095557.html
Copyright © 2011-2022 走看看