美文网首页
魔术方法及魔术常量详解

魔术方法及魔术常量详解

作者: 狂暴小绵羊 | 来源:发表于2020-06-07 00:35 被阅读0次
    魔术方法

    魔术方法中充当了举足轻重的作用,大部分魔术方法起着报错补救措施的作用

    • __construct()

      类的构造函数,在类实例化前调用

    • __destruct()

      类的析构函数,在类对象销毁时调用

    • __callStatic($method,$arg)

      当调用一个没有在类中声明的方法时,可以调用__call()方法代替声明一个方法。接受方法名和数组作为参数。

      public static function __callStatic($method,$arr)
      {
        echo "不存在静态方法".$method."你还传参";
        print_r($arr);
      }
      
    • __call($method,$arg)

      当调用一个没有在类中声明的方法时触发

      public function __call($method,$agr){
        echo "不存在成员方法".$method."你还传参";
        print_r($agr);
      }
      
    • __get($name)

      尝试获取一个没有权限的成员属性,或不存在的成员属性时调用

      public function __get($name)
      {
        echo $name."属性值获取".$this->age; //age为private
      }
      
    • __set($name,$value)

      尝试设置一个没有权限的成员属性,或不存在的成员属性时调用

      public function __set($name,$value)
      {
        $this->$name=$value;
      }
      
    • __isset($property_name)

      用于检测私有属性值是否被设定;如果对象里面成员是公有的,可以直接使用 isset() 函数。如果是私有的成员属性,那就需要在类里面加上一个 __isset() 方法

      private function __isset($property_name)
      {
          return isset($this->$property_name);
      }
      
    • __unset($property_name)

      方法用于删除私有属性;同 isset() 函数一样,unset() 函数只能删除对象的公有成员属性,当要删除对象内部的私有成员属性时,需要使用__unset() 方法

      private function __unset($property_name)
      {
          unset($this->$property_name);
      }
      
    • __sleep()

      执行serialize()时,先会调用这个函数

      public function __sleep() {
      
           echo "当在类外部使用serialize()时会调用这里的__sleep()方法<br>";
      
           $this->name = base64_encode($this->name);
      
           return array('name', 'age'); // 这里必须返回一个数值,里边的元素表示返回的属性名称
      
       }
      
    • __wakeup()

      执行unserialize()时,先会调用这个函数

      public function __wakeup()
      {
          echo '反序列化时调用';
      }
      
    • __toString()

      当我们尝试将一个对象或者数组当成字符串输出时调用

      function __tostring(){//在类中定义一个__toString方法
            return  "Hello,".$this->name."!<br/>";
      }
      
    • __invoke($x)

      当尝试以调用函数的方式调用一个对象时,该方法会被自动调用

      public function __invoke($param1, $param2)
      {
          var_dump($param1,$param2);
      }
      
    • __set_state($array)

      当调用 var_export() 导出类时,此静态 方法会被调用

      class A
      {
         public $var1;
         public $var2;
      
         public static function __set_state($an_array) // As of PHP 5.1.0
         {
             $obj = new A;
             $obj->var1 = $an_array['var1'];
             $obj->var2 = $an_array['var2'];
             return $obj;
         }
      }
      
      $a = new A;
      $a->var1 = 5;
      $a->var2 = 'foo';
      
      eval('$b = ' . var_export($a, true) . ';');//调用__set_state $b成为一个新的A的对象;
      var_dump($b);
      
    • __clone()

      当对象复制完成时调用

      public function __clone()
      {    #复制方法,可在里面定义再clone是进行的操作
                 $this->id = 0;
                 $this->account = clone $this->account;    #不加这一句,account在clone是会只被复制引用,其中一个account的balance被修改另一个也同样会被修改
      }
      $person2 = clone $person;
      
    • __autoload()

      尝试加载未定义的类

      public function __autoload($classname)
      {
        include_once($classname.'.php');
      }
      
    • __debugInfo()

      打印所需调试信息;由var_dump()、print_r()打印对象体的时候,控制对象体要输出的属性和值

      public function __debugInfo()
      {
          //使用数组来返回需要打印的属性和值;
          return [];
      }
      
    魔术常量
    • __LINE__ 文件中的当前行号
    • __FILE__ 文件的完整路径和文件名
    • __DIR__ 文件所在的目录
    • __FUNCTION__ 函数名称
    • __CLASS__ 类名
    • TRAIT 实现了代码复用的一个方法
    • __METHOD__ 类的方法名
    • __NAMESPACE__ 当前命名空间的名称

    相关文章

      网友评论

          本文标题:魔术方法及魔术常量详解

          本文链接:https://www.haomeiwen.com/subject/vwdqtktx.html