日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

php 传递类名,php 对象和数组序列化 serialize()返回字符串方便存储和传递 unserialize()反序列化 不丢失类型和结构...

發(fā)布時間:2024/9/27 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 php 传递类名,php 对象和数组序列化 serialize()返回字符串方便存储和传递 unserialize()反序列化 不丢失类型和结构... 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

現(xiàn)在開發(fā)中經(jīng)常使用序列號和反序列化技術(shù)手段,php開發(fā)中也大量使用到。如下幾個知名系統(tǒng)都使用了大量的序列化技術(shù)ecshop

2. phpcms內(nèi)容管理系統(tǒng)

3.laravel框架

一、序列號的目的?

方便數(shù)組和對象的傳輸或存儲,同時不丟失其類型和結(jié)構(gòu)

如下是ecshop中對支付配置信息序列化serialize($pay_config)之后更新到數(shù)據(jù)庫存儲$pay_config?=?serialize($pay_config);

/*?安裝,檢查該支付方式是否曾經(jīng)安裝過?*/

$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類文件,進(jìn)行反序列化操作,然后調(diào)用對象中的變量或方法試一試文件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;?//調(diào)用age屬性

$user->getName();?//調(diào)用getName()方法

var_dump($user);?//輸出$user對象看看

結(jié)果輸出$user->age的結(jié)果:10

調(diào)用$user->getName()的結(jié)果:重新安名字

object(userinfo)#1 (2) {

["name"]=>

string(15) "重新安名字"

["age"]=>

int(10)

}

結(jié)果說明:

unserialize.php中

1 . 輸出$user->age的結(jié)果:10 ? ? ? ? 執(zhí)行原理是對 O:8:"userinfo":2:{s:4:"name";s:15:"重新安名字";s:3:"age";i:10;}反序列化對象字符串之后執(zhí)行的

2. 調(diào)用$user->getName()的結(jié)果:重新安名字 ? ? ?執(zhí)行原理是反序列化之后重新實(shí)例化對象,在調(diào)用對象中的方法

原因:unserialize.php中執(zhí)行var_dump($user); 發(fā)現(xiàn)對象被序列化處理只保存了所有的變量,但不會保存對象的方法,只會保存類的名稱

php手冊說明:

所有php里面的值都可以使用函數(shù)serialize()來返回一個包含字節(jié)流的字符串來表示。unserialize()函數(shù)能夠重新把字符串變回php原來的值。 序列化一個對象將會保存對象的所有變量,但是不會保存對象的方法,只會保存類的名字。

為了能夠unserialize()一個對象,這個對象的類必須已經(jīng)定義過。如果序列化類A的一個對象,將會返回一個跟類A相關(guān),而且包含了對象所有變量值的字符串。 如果要想在另外一個文件中解序列化一個對象,這個對象的類必須在解序列化之前定義,可以通過包含一個定義該類的文件或使用函數(shù)spl_autoload_register()來實(shí)現(xiàn)。

在應(yīng)用程序中序列化對象以便在之后使用,強(qiáng)烈推薦在整個應(yīng)用程序都包含對象的類的定義。 不然有可能出現(xiàn)在解序列化對象的時候,沒有找到該對象的類的定義,從而把沒有方法的類__PHP_Incomplete_Class_Name作為該對象的類,導(dǎo)致返回一個沒有用的對象。

三、數(shù)組序列化和反序列話

/**

* 數(shù)組序列化,這里只是簡單演示一下,實(shí)際項(xiàng)目中數(shù)組序列化之后存儲在數(shù)據(jù)庫,在調(diào)用的地方反序列輸出

*/$arr?=?array('li','wang','ba');

print_r($arr);

$a?=?serialize($arr);

print_r($a);

$new_a?=?unserialize($a);

print_r($new_a);

總結(jié)

以上是生活随笔為你收集整理的php 传递类名,php 对象和数组序列化 serialize()返回字符串方便存储和传递 unserialize()反序列化 不丢失类型和结构...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。