php魔术方法(1)
概述:
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));
?>