一:魔术方法:
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();