插件窝 干货文章 PHP的魔术函数有哪些

PHP的魔术函数有哪些

MyClass 调用 示例 data 864    来源:    2025-03-16

PHP中的魔术方法(Magic Methods)是一些特殊的方法,它们以双下划线(__)开头,用于在特定的情况下自动调用。这些方法通常用于实现一些特殊的功能或行为。以下是PHP中常见的魔术方法:

  1. __construct()

    • 作用: 构造函数,在创建对象时自动调用。
    • 示例: php class MyClass { public function __construct() { echo "对象已创建!"; } } $obj = new MyClass(); // 输出: 对象已创建!
  2. __destruct()

    • 作用: 析构函数,在对象被销毁时自动调用。
    • 示例: php class MyClass { public function __destruct() { echo "对象已销毁!"; } } $obj = new MyClass(); unset($obj); // 输出: 对象已销毁!
  3. __get($name)

    • 作用: 在访问不可访问的属性时自动调用。
    • 示例:

      class MyClass {
       private $data = [];
      
       public function __get($name) {
           return $this->data[$name] ?? null;
       }
      }
      $obj = new MyClass();
      echo $obj->nonExistentProperty; // 输出: null
      
  4. __set($name, $value)

    • 作用: 在给不可访问的属性赋值时自动调用。
    • 示例:

      class MyClass {
       private $data = [];
      
       public function __set($name, $value) {
           $this->data[$name] = $value;
       }
      }
      $obj = new MyClass();
      $obj->nonExistentProperty = 'value'; // 不会报错
      
  5. __isset($name)

    • 作用: 在对不可访问的属性调用isset()empty()时自动调用。
    • 示例:

      class MyClass {
       private $data = [];
      
       public function __isset($name) {
           return isset($this->data[$name]);
       }
      }
      $obj = new MyClass();
      var_dump(isset($obj->nonExistentProperty)); // 输出: bool(false)
      
  6. __unset($name)

    • 作用: 在对不可访问的属性调用unset()时自动调用。
    • 示例:

      class MyClass {
       private $data = [];
      
       public function __unset($name) {
           unset($this->data[$name]);
       }
      }
      $obj = new MyClass();
      unset($obj->nonExistentProperty); // 不会报错
      
  7. __call($name, $arguments)

    • 作用: 在调用不可访问的方法时自动调用。
    • 示例: php class MyClass { public function __call($name, $arguments) { echo "调用了不存在的方法: $name"; } } $obj = new MyClass(); $obj->nonExistentMethod(); // 输出: 调用了不存在的方法: nonExistentMethod
  8. __callStatic($name, $arguments)

    • 作用: 在静态上下文中调用不可访问的方法时自动调用。
    • 示例: php class MyClass { public static function __callStatic($name, $arguments) { echo "调用了不存在的静态方法: $name"; } } MyClass::nonExistentStaticMethod(); // 输出: 调用了不存在的静态方法: nonExistentStaticMethod
  9. __toString()

    • 作用: 在将对象转换为字符串时自动调用。
    • 示例: php class MyClass { public function __toString() { return "这是一个MyClass对象"; } } $obj = new MyClass(); echo $obj; // 输出: 这是一个MyClass对象
  10. __invoke()

    • 作用: 在将对象作为函数调用时自动调用。
    • 示例: php class MyClass { public function __invoke($param) { echo "对象被作为函数调用,参数: $param"; } } $obj = new MyClass(); $obj('test'); // 输出: 对象被作为函数调用,参数: test
  11. __sleep()

    • 作用: 在对象被序列化时自动调用,返回一个包含需要序列化的属性名的数组。
    • 示例:

      class MyClass {
        private $data = 'data';
        private $secret = 'secret';
      
        public function __sleep() {
            return ['data']; // 只序列化$data属性
        }
      }
      $obj = new MyClass();
      echo serialize($obj); // 输出: O:7:"MyClass":1:{s:10:"Mydata";s:4:"data";}
      
  12. __wakeup()

    • 作用: 在对象被反序列化时自动调用,用于重新初始化对象。
    • 示例:

      class MyClass {
        private $data;
      
        public function __wakeup() {
            $this->data = '重新初始化';
        }
      }
      $obj = unserialize('O:7:"MyClass":1:{s:10:"Mydata";s:4:"data";}');
      echo $obj->data; // 输出: 重新初始化
      
  13. __clone()

    • 作用: 在对象被克隆时自动调用。
    • 示例: php class MyClass { public function __clone() { echo "对象已被克隆!"; } } $obj = new MyClass(); $obj2 = clone $obj; // 输出: 对象已被克隆!
  14. __set_state($array)

    • 作用: 在使用var_export()导出类时自动调用,用于返回一个对象的状态。
    • 示例:

      class MyClass {
        public $data;
      
        public static function __set_state($array) {
            $obj = new MyClass();
            $obj->data = $array['data'];
            return $obj;
        }
      }
      $obj = new MyClass();
      $obj->data = 'test';
      eval('$newObj = ' . var_export($obj, true) . ';');
      echo $newObj->data; // 输出: test
      
  15. __debugInfo()

    • 作用: 在使用var_dump()print_r()输出对象时自动调用,用于自定义输出的信息。
    • 示例:

      class MyClass {
        private $data = 'data';
        private $secret = 'secret';
      
        public function __debugInfo() {
            return ['data' => $this->data]; // 只输出$data属性
        }
      }
      $obj = new MyClass();
      var_dump($obj); // 输出: object(MyClass)#1 (1) { ["data"]=> string(4) "data" }
      

这些魔术方法为PHP开发者提供了强大的工具,可以在特定的情况下自动执行代码,从而实现更灵活和强大的功能。