php魔术方法演示

__construct()

类的构造函数,在类实例化对象时自动调用构造函数

代码演示

点击查看代码
<?php
class A{
    public $a='我是__construct';
    function __construct(){
        echo $this->a;
    }
}
$b = new A();

这个就是在实例化的时候就会触发

运行结果

image

__destruct()

类的析构函数,在对象销毁之前自动调用析构函数

代码演示

点击查看代码
<?php
class A{
    public $a='我是__destruct';
    function __destruct(){
        echo $this->a;
    }
}
$b = new A();

这个是在实例化后会进行一个自动删除的叫GC的机制进行删除

运行结果

image

__sleep()

在对象被序列化(使用 serialize() 函数)之前自动调用,可以在此方法中指定需要被序列化的属性,返回一个包含对象中所有应被序列化的变量名称的数组

代码演示

点击查看代码
<?php
class A{
    public $a='我是__sleep';
    function __sleep(){
        echo $this->a;
        return ['a'];
    }
}
$b = new A();
$c = serialize($b);

echo "\n".$c;

所有简单来说是需要存在一个返回数组的语句才会触发这个魔术函数

运行结果

image

__wakeup()

在对象被反序列化(使用 unserialize() 函数)之前自动调用,可以在此方法中重新初始化对象状态。

代码演示

点击查看代码
<?php
class A{
    public $a='我是__wakeup';
    function __wakeup(){
        echo $this->a;
    }
}
$b = new A();
$c = serialize($b);
$d = unserialize($c);

简单来说就是在进行反序列化之前会触发

运行结果

image

__set($property, $value)

当给一个对象的不存在或不可访问的属性赋值时自动调用,传递属性名和属性值作为参数。
先演示不存在

点击查看代码
<?php
class A{
    public $a='我是__set';
    function __set($property,$value){
        echo $this->a;
    }
}

$b = new A();
$b -> c = '触发位置';

这个是不存在的

接下来是俩不可访问的
注意这里指的不可访问是在当前情况下不可以访问不是说只有私有变量不能访问
比如我现在在类的外部我不能访问类内部的受保护属性,这同样是不可访问
但如果是私有属性,就只能在类内部自己访问,子类也不行
这里就简单演示一下受保护属性的

点击查看代码
<?php
class A{
    protected $a='我是__set';
    function __set($property,$value){
        echo $this->a;
    }
}

$b = new A();
$b -> a = '触发位置';

image

所以简单来说就是赋值给一个你不能赋值的变量的时候会触发

__get($property)

当访问一个对象的不存在或不可访问的属性时自动调用,传递属性名作为参数。

代码演示

这里不可访问和上面一样的情况,这里就直接两个一起演示了

点击查看代码
<?php
class A{
    public $a="\n我是__get";
    function __get($property){
        echo $this->a;
    }
}

$b = new A();
$b -> c;
$b -> b;

运行结果

image

简单来说就是访问无法访问的值的时候触发

posted @ 2025-06-22 20:30  crook666  阅读(31)  评论(0)    收藏  举报