php 传递类名,php 对象和数组序列化 serialize()返回字符串方便存储和传递 unserialize()反序列化 不丢失类型和结构...
現在開發中經常使用序列號和反序列化技術手段,php開發中也大量使用到。如下幾個知名系統都使用了大量的序列化技術ecshop
2. phpcms內容管理系統
3.laravel框架
一、序列號的目的?
方便數組和對象的傳輸或存儲,同時不丟失其類型和結構
如下是ecshop中對支付配置信息序列化serialize($pay_config)之后更新到數據庫存儲$pay_config?=?serialize($pay_config);
/*?安裝,檢查該支付方式是否曾經安裝過?*/
$sql?=?"SELECT?COUNT(*)?FROM?"?.?$ecs->table('payment')?.?"?WHERE?pay_code?=?'$payment'";
if?($db->GetOne($sql)?>?0)
{
$sql?=?"UPDATE?"?.?$ecs->table('payment')?.
"?SET?pay_config?=?'$pay_config',"?.
"?enabled?=?'1'?"?.
"WHERE?pay_code?=?'$payment'?LIMIT?1";
$db->query($sql);
}
二、對象的序列化
首先定義3個文件
user.php ?//用戶類
serialize.php //引入user.php類文件,初始對象,并且序列化對象
unserialize.php //引入user.php類文件,進行反序列化操作,然后調用對象中的變量或方法試一試文件user.phpserialize.phpunserialize.php
代碼class?userinfo{
public?$name?=?'';
public?$age?=?0;
public?function?setName($n){
$this->name?=?$n;
}
public?function?getName(){
echo?$this->name;
}
}include?'user.php';
$user?=?new?User();
$user->age?=?10;
$user->name?=?'lizhenghua';
$u?=?'重新安名字';
$user->setName($u);
$user->getName();
$u?=?serialize($user);
file_put_contents('store',$u);include?'user.php';
$s?=?file_get_contents('store');
$user?=?unserialize($s);
echo?$user->age;?//調用age屬性
$user->getName();?//調用getName()方法
var_dump($user);?//輸出$user對象看看
結果輸出$user->age的結果:10
調用$user->getName()的結果:重新安名字
object(userinfo)#1 (2) {
["name"]=>
string(15) "重新安名字"
["age"]=>
int(10)
}
結果說明:
unserialize.php中
1 . 輸出$user->age的結果:10 ? ? ? ? 執行原理是對 O:8:"userinfo":2:{s:4:"name";s:15:"重新安名字";s:3:"age";i:10;}反序列化對象字符串之后執行的
2. 調用$user->getName()的結果:重新安名字 ? ? ?執行原理是反序列化之后重新實例化對象,在調用對象中的方法
原因:unserialize.php中執行var_dump($user); 發現對象被序列化處理只保存了所有的變量,但不會保存對象的方法,只會保存類的名稱
php手冊說明:
所有php里面的值都可以使用函數serialize()來返回一個包含字節流的字符串來表示。unserialize()函數能夠重新把字符串變回php原來的值。 序列化一個對象將會保存對象的所有變量,但是不會保存對象的方法,只會保存類的名字。
為了能夠unserialize()一個對象,這個對象的類必須已經定義過。如果序列化類A的一個對象,將會返回一個跟類A相關,而且包含了對象所有變量值的字符串。 如果要想在另外一個文件中解序列化一個對象,這個對象的類必須在解序列化之前定義,可以通過包含一個定義該類的文件或使用函數spl_autoload_register()來實現。
在應用程序中序列化對象以便在之后使用,強烈推薦在整個應用程序都包含對象的類的定義。 不然有可能出現在解序列化對象的時候,沒有找到該對象的類的定義,從而把沒有方法的類__PHP_Incomplete_Class_Name作為該對象的類,導致返回一個沒有用的對象。
三、數組序列化和反序列話
/**
* 數組序列化,這里只是簡單演示一下,實際項目中數組序列化之后存儲在數據庫,在調用的地方反序列輸出
*/$arr?=?array('li','wang','ba');
print_r($arr);
$a?=?serialize($arr);
print_r($a);
$new_a?=?unserialize($a);
print_r($new_a);
總結
以上是生活随笔為你收集整理的php 传递类名,php 对象和数组序列化 serialize()返回字符串方便存储和传递 unserialize()反序列化 不丢失类型和结构...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: matplotlib 设置标注方向_Py
- 下一篇: jq设置保留两位小数_如何实现pytho