與類有關的其他魔術方法
序列化與反序列化技術
含義:
序列化:
就是將一個變量所代表的“內存”數據,轉換為“字符串”形式并持久保存在硬盤上的一種做法。
反序列化:
就是將序列化之后保存在硬盤上的“字符串數據”,恢復為其原來的內存形式的變量數據的一種做法。
序列化的做法:
$v1 = ?123; //這是一個變量,代表任意的內存數據
$s1 = ?serialize( $v1 ); //將任何類型的變量數據,轉換為“字符串”
file_put_contents( ‘要保存的目標文本文件’, $s1); //將該字符串,保存到一個文件里(就是硬盤數據)
反序列化的做法:
$s1 = file_get_contents( ‘保存序列化數據的目標文本文件’); //從一個文件里讀出其中的所有字符
$v1 = ?unserialize( $s1 ); //將該字符串數據,反序列化轉換為變量(數據)
舉例:
先進行基本數據的序列化:
再來對他們進行反序列化:
__sleep():用于對象的序列化:
1,對一個對象進行序列化,只能將其屬性數據“保存起來”,而方法被忽略(方法不是數據)
2,對象的序列化的時候,會自動調用該對象所屬類的這個魔術方法:__sleep()(前提是有該方法)。
且,此時,該方法必須返回一個數組,數組中是“計劃”要進行序列化的屬性名;
舉例:
類文件內容如下:
__wakeup:用于對象的反序列化:
1,對一個對象進行反序列化,其實是恢復其原來保存起來的屬性數據,而且,此時必然需要依賴該對象原本的所屬類;
2,對象在反序列化的時候,會自動調用該對象所屬類的這個魔術方法:__wakeup()
舉例:
下面演示可選屬性的序列化(通過__sleep):
然后,對其對象進行序列,并顯示該對象的數據:
然后,在另一個頁面中,對其進行反序列化:
__tostring()魔術方法——比較常用!
含義:
將一個對象“當做”一個字符串來使用的時候,會自動調用該方法,并且在該方法中,可以返回一定的字符串,以表明該對象轉換為字符串之后的結果。
注意:
如果沒有定義該方法,則對象無法當做字符串來使用!!!
__invoke()魔術方法:
將對象當作函數來使用的時候,會自動調用該方法。通常不推薦這么做。
class ?A{
function ?__invoke(){
echo “
我是一個對象呀,你別當我是一個函數來隨便調用!”;
}
}
$obj1 = new A();
$obj1(); //此時就會調用類中的方法:__invoke()