構造方法和析構方法(__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, ...) 格式排列的類屬性,
關于這個方法,有很多困惑,下面提供幾個鏈接,可以參看,
- The Magic __set_state Method
- PHP'S MYSTICAL __SET_STATE METHOD
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() 列印一個物件時,此方法會被呼叫,
參看
- Magic Methods
- 16 Magic Methods That PHP Developers Must Know
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/63432.html
標籤:PHP
下一篇:PHP 常用陣列函式詳解
