Home > Article > Backend Development > Instructions for using php __call method_PHP tutorial
This article will introduce to you the instructions for using the php __call method. Friends who need to learn the php __call method may refer to it for reference. I believe that all those who have just started to come into contact with PHP have seen the magic method __call in reference books, and have also seen its application examples! But when you actually start writing code, have you ever used it? ? To be honest, I have been using PHP for a while, but I have never applied it to actual development.
Let’s talk about the function of __call first: "The PHP5 object has a new special method. This method is used to monitor other methods in an object. If you try to call a method that does not exist in the object, the __call method will will be called automatically. "
Typical use cases:
代码如下 | 复制代码 |
runTest('in object context'); |
运行结果:
Calling object method 'runTest' in object context
不过,最近终于看到了一个__call在实际开发中的应用。thinkphp作为国内应用比较普遍的框架,在它里面对这个方法应用个人觉得算的上是完美啊!
比如在thinkphp的:lib->think->core->model.class.php文件里面(Model类)有这么一段代码:
代码如下 | 复制代码 |
/** +---------------------------------------------------------- * 利用__call方法实现一些特殊的Model方法 +---------------------------------------------------------- * @access public +---------------------------------------------------------- * @param string $method 方法名称 * @param array $args 调用参数 +---------------------------------------------------------- * @return mixed +---------------------------------------------------------- */ public function __call($method,$args) { if(in_array(strtolower($method),array('field','table','where','order','limit','page','alias','having','group','lock','distinct'),true)) { // 连贯操作的实现 $this->options[strtolower($method)] = $args[0]; return $this; }elseif(in_array(strtolower($method),array('count','sum','min','max','avg'),true)){ // 统计查询的实现 $field = isset($args[0])?$args[0]:'*'; return $this->getField(strtoupper($method).'('.$field.') AS tp_'.$method); }elseif(strtolower(substr($method,0,5))=='getby') { // 根据某个字段获取记录 $field = parse_name(substr($method,5)); $where[$field] = $args[0]; return $this->where($where)->find(); }else{ throw_exception(__CLASS__.':'.$method.L('_METHOD_NOT_EXIST_')); return; } } |
I won’t explain the specific functions of the code. Firstly, I may not be able to explain it clearly. Secondly, there is still a lot of value to be learned by looking at the programming ideas inside.
If you talk about his calling method, you can see how "powerful" he is.
Call:
$this->dao= M('table'); //Quick and high-performance instantiation of a table model
$this->dao->field($field)->where($where)->limit($offset . ',' . $limit)->select(); //Set the query field, Query conditions, set the query quantity, and finally execute the query operation. Of course, what is returned is the database record
See "something is wrong"? The field method has become an object, and the where, limit, and select methods have also become objects. In fact, the field and where methods do not exist in the Model class. It is precisely because these methods do not exist that the __call method is executed at this time, and then the $this object is returned. Therefore, this "connection" writing method can be realized, and one line of code can handle all SQL statements.
I won’t go on any further, I just want to introduce to you the practical application of the __call method. If you want to fully understand it, it is recommended that you look at the source code of thinkphp yourself! (Disclaimer: I have nothing to do with thinkphp, and I am not advocating its goodness)