• 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;             //获取克隆对象属性,发现改变
    ?>
    
    • 综上,克隆后的对象属性的改变不影响原对象
    • 克隆的过程中,可以自己设置自己的值,没必要完全克隆(根据实际情况)
    异乡小龟
  • 相关阅读:
    Redis其他知识
    Mybatis的sql语句操作
    Redis
    mybatis插件原理
    mybatis工作原理
    Mybatis逆向工程
    mybatis缓存机制
    Mybatis查询
    zabbix api添加主机
    jenkins + bitbucket 实现 pr自动构建及build状态通知
  • 原文地址:https://www.cnblogs.com/scale/p/6236768.html
Copyright © 2020-2023  润新知