PHP类的魔术方法详解
构造方法和析构方法(__construct、__destruct
)
__construct
在类实例化的时候会调用。
__destruct
对象被手动销毁或垃圾回收机制收回前会被调用。
unset() ,对象=null
属性重载(__set、__get、__isset、__unset
)
public __set ( string $name , mixed $value ) : void
public __get ( string $name ) : mixed
public __isset ( string $name ) : bool
public __unset ( string $name ) : void
在给不可访问或不存在属性赋值时,__set
会被调用。
读取不可访问或不存在属性的值时,__get
会被调用。
当对不可访问或不存在属性调用 isset() 或 empty() 时,__isset
会被调用。
当对不可访问或不存在属性调用 unset() 时,__unset
会被调用。
参数中 name 是调用的属性名,value 是给属性指定的值。
方法重载(__call、__callStatic
)
public __call ( string $name , array $arguments ) : mixed
public static __callStatic ( string $name , array $arguments ) : mixed
在对象中调用一个不可访问或不存在方法时,__call()
会被调用。
在类中调用一个不可访问或不存在的静态方法时,__callStatic
会被调用。
参数中 name 是调用的方法名,arguments 是传递给方法的参数,一个索引数组。
__toString
public __toString ( void ) : string
一个类被当成字符串时应怎样回应。例如 echo 或print 应该显示些什么。
此方法必须返回一个字符串,否则会发出一条 E_RECOVERABLE_ERROR
级别的致命错误。
__invoke
__invoke ([ $... ] ) : mixed
当尝试以调用函数的方式调用一个对象时,__invoke
方法会被自动调用。
__sleep
和 __wakeup
public __sleep ( void ) : array
public __wakeup ( void ) : void
对一个对象进行序列化serialize()
操作时, __sleep
会被调用,返回一个包含对象希望被序列化的属性名的数组。
对象被序列化,即睡觉sleep前的操作,常用于清理数据。
对应的,一个对象醒来unserialize()
时会自动调用__wakeup
,用于重新做些初始化工作。
一个典型应用是,数据库连接对象的序列化,醒来时需要重新connect,如下面的例子。
<?php
class Connection
{
protected $link;
private $dsn, $username, $password;
public function __construct($dsn, $username, $password)
{
$this->dsn = $dsn;
$this->username = $username;
$this->password = $password;
$this->connect();
}
private function connect()
{
$this->link = new PDO($this->dsn, $this->username, $this->password);
}
public function __sleep()
{
return array('dsn', 'username', 'password');
}
public function __wakeup()
{
$this->connect();
}
}?>
__serialize
和 __unserialize
public __serialize ( void ) : array
public __unserialize ( array $data ) : void
PHP 7.4.0.新增加的特性,作用跟sleep和wakeup差不多,但优先级更高,且参数和返回值稍有差异,__serialize
是返回一个键值对的关联数组,此数组将作为参数 data 传递给__unserialize
。
示例如下:
<?php
class Connection
{
protected $link;
private $dsn, $username, $password;
public function __construct($dsn, $username, $password)
{
$this->dsn = $dsn;
$this->username = $username;
$this->password = $password;
$this->connect();
}
private function connect()
{
$this->link = new PDO($this->dsn, $this->username, $this->password);
}
public function __serialize(): array
{
return [
'dsn' => $this->dsn,
'user' => $this->username,
'pass' => $this->password,
];
}
public function __unserialize(array $data): void
{
$this->dsn = $data['dsn'];
$this->username = $data['user'];
$this->password = $data['pass'];
$this->connect();
}
}?>
__set_state
static __set_state ( array $properties ) : object
自 PHP 5.1.0 起,当调用 var_export() 导出类时,此静态方法会被自动调用。
本方法的唯一参数是一个数组,其中包含按 array('property' => value, ...) 格式排列的类属性。
关于这个方法,有很多困惑,下面提供几个链接,可以参看。
class Dummy {
private $value1_;
private $value2_;
function __construct() {
$this->value1_ = 100;
$this->value2_ = "100";
}
}
$aDummy = new Dummy();
var_export($aDummy);
输出
Dummy::__set_state(array( 'value1_' => 100, 'value2_' => '100', ))
加上state方法后
class Dummy {
private $value1_;
private $value2_;
function __construct() {
$this->value1_ = 100;
$this->value2_ = "100";
}
static function __set_state(array $array) {
foreach($array as $k => $v) {
echo("$k ==> $v <br/>");
}
}
}
输出为
value1_ ==> 100
value2_ ==> 100
__clone
__clone ( void ) : void
当对象复制完成时调用
__debugInfo
__debugInfo ( void ) : array
打印所需调试信息,当用 var_dump() 打印一个对象时,此方法会被调用。
参看
作者:皎然CEO
链接:https://www.cnblogs.com/jiaoran/p/12641351.html
个性签名:独学而无友,则孤陋而寡闻。做一个灵魂有趣的人!
如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦(っ•̀ω•́)っ✎⁾⁾!