PHP魔术方法和魔术变量


PHP魔术方法和魔术变量

  1. __construct():构造方法,在创建对象时自动调用,用于初始化对象的属性和执行其他必要的操作。
class MyClass {
  public function __construct() {
    echo 'Object created';
  }
}

$obj = new MyClass(); // 输出:Object created
  1. __destruct():析构方法,在对象被销毁时自动调用,用于执行清理和释放资源的操作。
class MyClass {
  public function __destruct() {
    echo 'Object destroyed';
  }
}

$obj = new MyClass();
unset($obj); // 输出:Object destroyed
  1. __get($property) 和 __set($property, $value):用于在访问对象的不存在或不可访问属性时自动调用。
class MyClass {
  private $data = [];

  public function __get($property) {
    if (isset($this->data[$property])) {
      return $this->data[$property];
    }
    return null;
  }

  public function __set($property, $value) {
    $this->data[$property] = $value;
  }
}

$obj = new MyClass();
$obj->name = 'John'; // 设置属性
echo $obj->name; // 获取属性(输出:John)
  1. __call($method, $arguments) 和 __callStatic($method, $arguments):用于在调用对象的不存在或不可访问方法时自动调用。
class MyClass {
  public function __call($method, $arguments) {
    echo "Method '$method' does not exist";
  }

  public static function __callStatic($method, $arguments) {
    echo "Static method '$method' does not exist";
  }
}

$obj = new MyClass();
$obj->nonExistentMethod(); // 输出:Method 'nonExistentMethod' does not exist

MyClass::nonExistentStaticMethod(); // 输出:Static method 'nonExistentStaticMethod' does not exist
  1. __toString():在将对象转换为字符串时自动调用,可以定义对象的字符串表示形式。
class MyClass {
  public function __toString() {
    return 'This is my object';
  }
}

$obj = new MyClass();
echo $obj; // 输出:This is my object
  1. __isset($property) 和 __unset($property):在检查属性是否存在或删除属性时自动调用。
class MyClass {
  private $data = [];

  public function __isset($property) {
    return isset($this->data[$property]);
  }

  public function __unset($property) {
    unset($this->data[$property]);
  }
}

$obj = new MyClass();
$obj->name = 'John';
var_dump(isset($obj->name)); // 检查属性是否存在(输出:bool(true))
unset($obj->name); // 删除属性
var_dump(isset($obj->name)); // 检查属性是否存在(输出:bool(false))
  1. __clone():在对象被克隆时自动调用,可以在克隆对象时执行一些额外的操作。
class MyClass {
  public function __clone() {
    echo 'Object cloned';
  }
}

$obj1 = new MyClass();
$obj2 = clone $obj1; // 输出:Object cloned
  1. __sleep() 和 __wakeup():用于在对象序列化和反序列化时自动调用。
class MyClass {
  private $data;

  public function __construct() {
    $this->data = 'Some data';
  }

  public function __sleep() {
    return ['data'];
  }

  public function __wakeup() {
    echo 'Object revived';
  }
}

$obj = new MyClass();
$serialized = serialize($obj); // 序列化对象
$unserialized = unserialize($serialized); // 反序列化对象,输出:Object revived
  1. __invoke($arguments):使对象可以像函数一样被调用。
class MyClass {
  public function __invoke($arg) {
    echo "Called with argument: $arg";
  }
}

$obj = new MyClass();
$obj('Hello'); // 输出:Called with argument: Hello
  1. __getClassName():在获取对象的类名时自动调用,可以返回对象所属的类名。
class MyClass {
  public function __getClassName() {
    return __CLASS__;
  }
}

$obj = new MyClass();
echo $obj->__getClassName(); // 输出:MyClass