zoukankan      html  css  js  c++  java
  • 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;             //获取克隆对象属性,发现改变
    ?>
    
    • 综上,克隆后的对象属性的改变不影响原对象
    • 克隆的过程中,可以自己设置自己的值,没必要完全克隆(根据实际情况)
    异乡小龟
  • 相关阅读:
    Windows XP下 Android开发环境 搭建
    Android程序的入口点
    在eclipse里 新建android项目时 提示找不到proguard.cfg
    64位WIN7系统 下 搭建Android开发环境
    在eclipse里 新建android项目时 提示找不到proguard.cfg
    This Android SDK requires Android Developer Toolkit version 20.0.0 or above
    This Android SDK requires Android Developer Toolkit version 20.0.0 or above
    Android requires compiler compliance level 5.0 or 6.0. Found '1.4' instead
    Windows XP下 Android开发环境 搭建
    Android程序的入口点
  • 原文地址:https://www.cnblogs.com/scale/p/6236768.html
Copyright © 2011-2022 走看看