Blogger Information
Blog 35
fans 0
comment 0
visits 27581
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
面向对象魔术方法之__call(),__callStatic()
小的博客
Original
886 people have browsed it

一:魔术方法:

  1,__call($name,$argument);当调用一个不存在的动态方法是自动调用;有两个参数,第一个是函数名,第二个是参数数  组 ,使用这种方法通常是希望可以跨类调用,这个时候需要使用函数,call_user_func_array([对象名,函数名,参数数组]);


2,__callStatic($name,$argument);当用户调用一个不存在的静态方法时自动调用,第一个参数是函数名,第二个参数是参数数组,使用这个方法也可以跨类使用,涉及的函数是call_user_func_array([对象,函数名,参数数组]);


 以下的是文本demo_obj2.php中的代码,我们来演示在同一个页面,跨类调用动态方法和静态方法的操作;

<?php
 header('Content-Type:text/html;charset=utf-8');
 class Demo1{
  function hello($arg1,$arg2,$arg3){
   return '<h3 style="color:skyblue">哈哈,我才是真正的hello(),找到我了吗?</h3>'.$arg1.$arg2.$arg3;
 }
     static function get($name,$job){
   return '<h2 style="color:red">我才是真正的get()方法,找到我了吗?</h2>'.$name.'是'.$job;
  }
 }
 class Demo2{
  public function __call($name,$argument){
  // echo $name;print_r($argument);
  //call_user_func_array();可以实现跨类调用hello()方法
   return call_user_func_array([(new Demo1),$name],$argument);
  }
  public static function __callStatic($name,$argument){
   echo $name;print_r($argument);
   //call_user_func_array();可以实现跨类调用get();方法
   return call_user_func_array(['Demo1',$name],$argument);
  }
 }
 $obj=new Demo2();
 echo $obj->hello('PHP','JAVA','JS');//直接调用hello();方法会报错这个时候需要用到__call();
 echo Demo2::get('Jack','程序员');//这个时候直接调用静态方法get()会报错需要用到__callStatic()方法
 ?>

二:以下是demo_obj1.php中的文本;我们在这个页面来演示

__call(),

__callStatic();

的夸页面使用方法;跟上面的同一个页面跨类使用方法基本上相同,不同之处在于首先要引入demo_obj2.php文件;

require 'demo_obj2.php';//导入demo_obj2.php文件
class DemoCall{
 function __call($name,$argument){
  //其实更多时候,我们是想通过这种方法跨类调用另一个方法,这要用到一个特殊函数call_user_func_array()
        //call_user_func_array($method,$array_param);
//        print_r($arguments);
        //call_user_func_array([对象,'方法名',参数数组])
   return call_user_func_array([new Demo1,$name],$argument);
 }
 public static function __callStatic($name,$argument){
  return call_user_func_array(['Demo1',$name],$argument);
 }
}
$object=new DemoCall();
//$object->hello('www','PHP','Learning');
echo $object->hello('www','PHP','Learning');
echo  DemoCall::get('Peter','讲师');//肯定会报错
//直接调用hello()方法会报错;这个时候需要用到__call();

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