1、_ _toString 和 invoke (tostring 和 invoke 两者的触发形式接近。)

(1)、_ _tostring() 表达方式错误导致魔术方法触发。 触发时机:把对象当成字符串调用。

示例代码:

 <?php
 class User {
  var $benben = "this is test";
  public function __toString(){
  return '格式不对,无法输出';
  }
  }
 $test  = new User();
 print_r($test);
 echo "\n";
 echo $test;   //将对象当成字符串调用,执行toString
 ?>

(2)、_ _invoke() 格式表达错误导致魔术方法触发。触发时机:把对象当成函数调用。

示例代码:

 <?php
 class User {
  var $lantu = "this is a test!!";
  public function __invoke(){
  echo '它不是个函数';
  }
 }
 $test = new User();
 echo $test-> lantu;
 echo "\n";
 echo $test()-> lantu; //将test当成函数调用,触发invoke
 ?>

 

2、_ _call( ) 用来检测所调用的成员方法是否存在。

触发时机:调用一个不存在的方法。

参数:2个参数 $arg1,$arg2

返回值:调用的不存在的方法的名称和参数。

代码示例:

 <?php
 class User{
  public function __call($arg1,$arg2){
  echo"$arg1,$arg2[0]";
  }
 }
 $test = new User();
 $test -> call11('a');    //调用call11方法,此方法不存在,触发call
 ?>

3、_ _callStatic( )

触发时机:静态调用或调用成员常量时使用的方法不存在

参数:2个参数 $arg1,$arg2

返回值:调用的不存在的方法的名称和参数

示例代码:

 <?php
 class User{
  public function __callStatic($arg1,$arg2){
  echo"$arg1,$arg2[0]";
  }
 }
 $test = new User();
 $test::call11('a'); //跟call差不多,但是callStatic用于静态调用时触发
 $test ->call11('a');//不会调用callStatic
 ?>

4、_ _get()

触发时机:调用的成员属性不存在

参数:1个参数 $arg1

返回指:不存在的成员属性的名称

示例代码:

 <?php
 class User{
  public $var1;
  public function __get($arg1)
  {
  echo $arg1."不存在";
  }
 }
 
 $test = new User();
 $test ->var2;     //User中不存在成员属性var2,此时会调用get
 ?>

5、_ _set()

触发时机:给不存在的成员属性赋值。

参数:2个参数 $arg1,$arg2

返回指:不存在的成员属性的名称和赋的值

示例代码:

 <?php
 class User{
  public $var1;
  public function __set($arg1,$arg2){
  echo $arg1.','.$arg2;
  }
 }
 
 $test = new User();
 $test ->var2=1;        //var2 不存在的成员属性,为其赋值时会调用set
 ?>

6、_ _isset()

触发时机:对不可访问属性使用isset()或empty()时,isset()会被调用。

参数:传参 $arg1

返回值:不存在的成员属性的名称。

 <?php
 class User{
  protected $var1;
  private $var;
  public function __isset($arg1){
  echo $arg1;
  }
 }
 
 $test = new User();
 isset($test->var1);    //protected 只能在该类和该类的子类中使用,因此此处也会触发isset魔术方法。
 echo "\n";
 isset($test->var);     //外部无法访问,触发isset
 ?>

7、_ _unset()

触发时机:对不可访问属性使用unset()时

参数:1个参数

返回值:不存在的成员属性的名称

示例代码:

 //这里代码基本跟isset相同。
 <?php
 class User{
  protected $var1;
  private $var;
  public function __unset($arg1){
  echo $arg1;
  }
 }
 
 $test = new User();
 unset($test->var1);  
 echo "\n";
 unset($test->var);
 ?>

8、_ _clone()

触发时机:当使用clone关键字拷贝完成一个对象后,新对象会自动调用定义的魔术方_ _clone()。

示例代码:

 <?php
 class User{
  private $var;
  public function __clone(){
  echo "__clone test";
  }
 }
 
 $test = new User();
 $newclass = clone ($test); //此处调用clone魔术方法。
 ?>
 
版权声明:本文为泡面加茶原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/paomianjiacha/p/17006503.html