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

魔术方法及魔术常量详解

作者: 狂暴小绵羊 | 来源:发表于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