php魔术方法使用场景

php魔术方法-----__tostring(),__invoke,__call(),__callStatic ...

__tostring(),__invoke()



  • __tostring()方法是在对象当作字符串输出时被自动调用
  • __invoke()方法是在对象当作方法时被自动调用
<?php

class Tomato {
     public function __tostring(){
        return "string";
     }
     public function __invoke(){
        echo "invoke";
     }
}
 
 $tomato = new Tomato(); 
 echo $tomato;          //对象当作字符串输出
 $tomato();             //对象当作方法

__call(),__callStatic()



  • __call()实现对方法的重载
  • __callStatic()实现对静态方法的重载
  • implode()等价于spilt()方法
<?php

 class Tomato {
 public function __call($name, $arguments){
           echo '$name:'.$name.'$arguments:'.implode(", ", $arguments);
     }
     public static function __callStatic($name, $arguments){
           echo '$name:'.$name.'$arguments:'.implode(", ", $arguments);
     }
  }
 $tomato->runSet("Allo", "Bllo");   //类内部没有该方法,是通过__call()重载实现的
 Tomato::deRunSet("Cllo", "Dllo");  //类内部没有该静态方法,是通过__callStatic()重载实现的
?>

__get(),__set()__isset(),__unset(),__empty()



  • 获取对象属性时__get()被自动调用,一般用于获取私有属性
  • 设置对象属性时__set()被自动调用
  • isset判断是否存在该属性,empty相反
  • 释放变量时__unset(),被自动调用
<?php

 class Tomato {
 private $name = "火星情报局";
 public function __get($name){     //参数为属性名
          if(isset($name)){       //isset判断是否存在该属性,与empty相反
             echo "存在";
             echo $this->name;
          }else{
             return null;
          }
     }
     public function __set($name, $value){   //参数为 属性名、属性值
           echo $this->$name = $value;       //设置属性
     }
    
     public function __unset($name){         //释放属性变量时,被自动调用
      echo "null";
     }
 }
 $tomato->name;              //获取元素属性
 $tomato->name = "提莫队长"; //设置元素属性
 unset($tomato->name);       //释放变量
?>

__clone()



  • __clone(),在对象被克隆时调用
  • 克隆后的对象具有与原对象相同的所有属性、方法
  • 克隆后的对象属性的改变不影响原对象,即互不影响
  • __clone()方法内部可以设置哪些属性不必克隆,用自己设置即可
<?php

 class Tomato {
 private $name = "火星情报局";
 private $title = "沈梦晨"; 
 private $data = "2016";
 public function __clone(){
         echo $this->name = "老坛酸菜";    //该属性不必克隆,用自己设置的
     }
 }
 $tomato2 = clone $tomato;   //克隆对象
 $tomato2->data="2017";      //通过克隆对象该变属性
 $tomato->name;              //获取原对象属性
 $tomato->title;             //原对象属性
 $tomato->data;              //获取原对象属性,发现没有改变
 $tomato2->name;             //获取现对象属性
 $tomato2->title;            //克隆对象属性,与原对象不一样
 $tomato2->data;             //获取克隆对象属性,发现改变
?>
  • 综上,克隆后的对象属性的改变不影响原对象
  • 克隆的过程中,可以自己设置自己的值,没必要完全克隆(根据实际情况)

转载于:https://www.cnblogs.com/scale/p/6236768.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值