PHP魔术方法和魔术变量
__construct()
:构造方法,在创建对象时自动调用,用于初始化对象的属性和执行其他必要的操作。
class MyClass {
public function __construct() {
echo 'Object created';
}
}
$obj = new MyClass(); // 输出:Object created
__destruct()
:析构方法,在对象被销毁时自动调用,用于执行清理和释放资源的操作。
class MyClass {
public function __destruct() {
echo 'Object destroyed';
}
}
$obj = new MyClass();
unset($obj); // 输出:Object destroyed
- __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)
- __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
- __toString():在将对象转换为字符串时自动调用,可以定义对象的字符串表示形式。
class MyClass {
public function __toString() {
return 'This is my object';
}
}
$obj = new MyClass();
echo $obj; // 输出:This is my object
- __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))
- __clone():在对象被克隆时自动调用,可以在克隆对象时执行一些额外的操作。
class MyClass {
public function __clone() {
echo 'Object cloned';
}
}
$obj1 = new MyClass();
$obj2 = clone $obj1; // 输出:Object cloned
- __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
- __invoke($arguments):使对象可以像函数一样被调用。
class MyClass {
public function __invoke($arg) {
echo "Called with argument: $arg";
}
}
$obj = new MyClass();
$obj('Hello'); // 输出:Called with argument: Hello
- __getClassName():在获取对象的类名时自动调用,可以返回对象所属的类名。
class MyClass {
public function __getClassName() {
return __CLASS__;
}
}
$obj = new MyClass();
echo $obj->__getClassName(); // 输出:MyClass