博客列表 >面向对象魔术方法之__call(),__callStatic()

面向对象魔术方法之__call(),__callStatic()

小的博客
小的博客原创
2018年01月12日 11:48:18873浏览

一:魔术方法:

  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();

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议