概述:

PHP 魔术方法:一个预定义好的,在特定情况下自动触发的行为方法。

魔术方法相关进制:触发时机,功能,参数,返回指。

1、构造函数和析构函数。

__construct() 构造函数,在实例化一个对象时,首先会去执行的一个方法;

示例代码:

<?php
class User
{
    public $username;
    public function __construct($username)
    {
        $this->username = $username;
        echo "触发了构造函数";
    }
}

$test = new User("hongmao");    //实力化对象时触发构造函数 __construct()
$ser = serialize($test);                //序列化时不会触发
unserialize($ser);                      //反序列化时也不会触发
?>

__destruct() 析构函数,在对象的所有引用被删除或者当对象被显式销毁时执行的魔术方法。

示例代码:

<?php
class User{
   public function __destruct(){
      echo"触发了析构函数"."<br />";
   }
}

$test = new User("lantu");        //实例化对象结束后,代码运行完全会销毁,触发析构函数。
$ser = serialize($test);
unserialize($ser);       //反序列化后,触发析构函数。
?>

2、__sleep()

序列化serialize()函数会检查类中是否存在一个魔术方法 __sleep()。如果存在,__sleep()会被先调用,然后才执行序列化操作。

触发时机:序列化serialize()之前。

功能:对象被序列化之前触发,返回需要被序列化存储的成员属性,删除不必要的属性。

参数:成员属性。

返回值:需要被序列化的存储的成员属性。

示例代码:

<?php
class User{
    const SITE = 'uusama';
    public $username;
    public $nickname;
    private $password;
    public function __construct($username,$nickname,$password)
    {
        $this->username = $username;
        $this->nickname = $nickname;
        $this->password = $password;
    }
    public function __sleep(){
        return array('username','nickname');
    }
}

$user = new User(a,b,c);
echo serialize($user);
?>

3、__wakeup()

unserialize() 会检查是否存在一个_ _wakeup()方法,如果存在,则先调用 _ _wakeup(),预先准备对象需要的资源。

触发时机:反序列化 unserialize() 之前

注:

_ _wakeup() 在反序列化unserialize()之前

_ _destruct() 在反序列化unserialize()之后

示例代码:

<?php
class User{
    const SITE = 'uusama';
    public $username;
    public $nickname;
    private $password;
    private $order;
    public function __wakeup(){
        $this->password = $this->username;
    }
}

$user_ser = 'O:4:"User":2:{s:8:"username";s:1:"a";s:8:"nickname";s:1:"b";};';
var_dump(unserialize($user_ser));
?>
版权声明:本文为泡面加茶原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/paomianjiacha/p/17004041.html