日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > php >内容正文

php

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

發布時間:2024/9/27 php 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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()反序列化 不丢失类型和结构...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。