PHP基礎(chǔ)之類和對(duì)象15——魔術(shù)方法
PHP 將所有以 __(兩個(gè)下劃線)開(kāi)頭的類方法保留為魔術(shù)方法。所以在定義類方法時(shí),除了上述魔術(shù)方法,建議不要以 __ 為前綴。
__sleep()?和?__wakeup()publicarray__sleep?( void )
void__wakeup?( void )
serialize( )?函數(shù)會(huì)檢查類中是否存在一個(gè)魔術(shù)方法?__sleep( )。如果存在,該方法會(huì)先被調(diào)用,然后才執(zhí)行序列化操作。此功能可以用于清理對(duì)象,并返回一個(gè)包含對(duì)象中所有應(yīng)被序列化的變量名稱的數(shù)組。如果該方法未返回任何內(nèi)容,則?NULL?被序列化,并產(chǎn)生一個(gè)?E_NOTICE?級(jí)別的錯(cuò)誤。
注意:
__sleep()?不能返回父類的私有成員的名字。這樣做會(huì)產(chǎn)生一個(gè)?E_NOTICE?級(jí)別的錯(cuò)誤。可以用?Serializable?接口來(lái)替代。
__sleep()?方法常用于提交未提交的數(shù)據(jù),或類似的清理操作。同時(shí),如果有一些很大的對(duì)象,但不需要全部保存,這個(gè)功能就很好用。
與之相反,?unserialize()?會(huì)檢查是否存在一個(gè)?__wakeup()?方法。如果存在,則會(huì)先調(diào)用?__wakeup?方法,預(yù)先準(zhǔn)備對(duì)象需要的資源。
__wakeup()?經(jīng)常用在反序列化操作中,例如重新建立數(shù)據(jù)庫(kù)連接,或執(zhí)行其它初始化操作。
Example #1 Sleep 和 wakeup
class Connection{ protected $link; private $server,$username,$password,$db; public function __construct($server,$username,$password,$db) {$this->server = $server;$this->username = $username;$this->password = $password;$this -> db = $db;$this -> connect(); } private function connect(){$this -> link = mysql_connect($this->server,$this->username,$this->password);mysql_select_db($this->db,$this->link); } public function __sleep(){return array(’server’,’username’,’password’,’db’); } public function __wakeup(){$this->connect(); }}__toString()
public string?__toString?( void )
__toString()?方法用于一個(gè)類被當(dāng)成字符串時(shí)應(yīng)怎樣回應(yīng)。例如?echo $obj;?應(yīng)該顯示些什么。此方法必須返回一個(gè)字符串,否則將發(fā)出一條?E_RECOVERABLE_ERROR?級(jí)別的致命錯(cuò)誤。
不能在?__toString()?方法中拋出異常,這么做會(huì)導(dǎo)致致命錯(cuò)誤。
Example #2 簡(jiǎn)單示例
class TestClass{ public $foo; public function __construct($foo) {$this->foo = $foo; } public function __toString(){return $this->foo; }}$class = new TestClass(’Hello’);echo $class;
輸出結(jié)果:
Hello
需要指出的是在 PHP 5.2.0 之前,__toString()?方法只有在直接使用于?echo?或?print?時(shí)才能生效。PHP 5.2.0 之后,則可以在任何字符串環(huán)境生效(例如通過(guò)?printf(),使用?%s?修飾符),但不能用于非字符串環(huán)境(如使用?%d?修飾符)。自 PHP 5.2.0 起,如果將一個(gè)未定義?__toString()?方法的對(duì)象轉(zhuǎn)換為字符串,會(huì)產(chǎn)生?E_RECOVERABLE_ERROR?級(jí)別的錯(cuò)誤。
__invoke()mixed__invoke?([?$...?] )
當(dāng)嘗試以調(diào)用函數(shù)的方式調(diào)用一個(gè)對(duì)象時(shí),__invoke()?方法會(huì)被自動(dòng)調(diào)用。
注意:
本特性只在 PHP 5.3.0 及以上版本有效。
Example #3 使用?__invoke()
class CallableClass{ function __invoke($x){var_dump($x); }}$obj = new CallableClass;$obj(5);var_dump(is_callable($obj));
輸出結(jié)果:
int(5)
bool(true)
__set_state()static object?__set_state?( array?$properties?)
自 PHP 5.1.0 起當(dāng)調(diào)用?var_export()?導(dǎo)出類時(shí),此靜態(tài)方法會(huì)被調(diào)用。
本方法的唯一參數(shù)是一個(gè)數(shù)組,其中包含按?array(’property’ => value, ...)?格式排列的類屬性。
Example #4 使用?__set_state()>(PHP 5.1.0 起)
class A{ public $var1; public $var2; public static function __set_state($an_array) {$obj = new A;$obj -> var1 = $an_array[’var1’];$obj -> var2 = $an_array[’var2’];return $obj; }}$a = new A;$a->var1 = 5;$a->var2 = ’foo’;eval(’$b=’.var_export($a,true).’;’);var_dump($b);
輸出結(jié)果:
object(A)#2 (2) { ['var1']=> int(5) ['var2']=> string(3) 'foo' }
相關(guān)文章:
1. React+umi+typeScript創(chuàng)建項(xiàng)目的過(guò)程2. ASP調(diào)用WebService轉(zhuǎn)化成JSON數(shù)據(jù),附j(luò)son.min.asp3. php測(cè)試程序運(yùn)行速度和頁(yè)面執(zhí)行速度的代碼4. php網(wǎng)絡(luò)安全中命令執(zhí)行漏洞的產(chǎn)生及本質(zhì)探究5. ASP.NET Core 5.0中的Host.CreateDefaultBuilder執(zhí)行過(guò)程解析6. 無(wú)線標(biāo)記語(yǔ)言(WML)基礎(chǔ)之WMLScript 基礎(chǔ)第1/2頁(yè)7. Warning: require(): open_basedir restriction in effect,目錄配置open_basedir報(bào)錯(cuò)問(wèn)題分析8. ASP中常用的22個(gè)FSO文件操作函數(shù)整理9. SharePoint Server 2019新特性介紹10. 三個(gè)不常見(jiàn)的 HTML5 實(shí)用新特性簡(jiǎn)介
