首頁 後端開發 php教程 PHP中的串列化變數與序列化物件_PHP教程

PHP中的串列化變數與序列化物件_PHP教程

Jul 21, 2016 pm 04:11 PM
php 變數 字串 位元組 物件 序列化 成為 轉化

  串行化大概就是把一些变量转化成为字符串的字节流的形式,这样比较容易传输、存储。当然,关是传输存储没有什么,关键是变成串的形式以后还能够转化回来,而且能够保持原来数据的结构。

  在PHP中有多串行化处理的函数:serialize(),该函数把任何变量值(除了资源变量)转化为字符串的形式,可以把字符串保存到文件里,或者注册为Session,乃至于使用curl来模拟GET/POST来传输变量,达到RPC的效果。

  如果要将串行化的变量转化成PHP原始的变量值,那么可以使用unserialize()函数。

  一、变量串行化

  我们举简单的例子来说明串行化,以及它的存储格式。

  整型:

  $var = 23;
  echo serialize($var);

  输出:

  i:23;

  浮点型:

  $var = 1.23;

  echo serialize($var);

  输出:

  d:1.229999999999999982236431605997495353221893310546875;

  字符串:

  $var = "This is a string";
  echo serialize($var);
  $var = "我是变量";
  echo serialize($var);

  输出:

  s:16:"This is a string";
  s:8:"我是变量";

  布尔型:

  $var = true;
  echo serialize($var);
  $var = false;
  echo serialize($var);

  输出:

  b:1;
  b:0;

  上面这些基本类型串行化之后的情况很清楚,串行化之后的存储格式是:

  变量类型:[变量长度:]变量值;

  就是第一位字符代表变量类型,第二个:代表分割,变量长度是可选的,就是在字符串类型里有,其他类型没有,最后一个就是变量值,每个串行化的值以";"作为结束。

  比如我们整型数字23串行化之后就是:i:23,那么它没有长度,只有类型和变量值,i代表integer,通过冒号分割,后面保存的是整型值23,包括浮点型(双字节型)也是一样。布尔型的话,类型是b(boolean),如果是true的话,那么串行化的值是1,如果是false那么值就是0。字

  符串值话中间会多一个保存的值得,保存字符串的长度值,比如字符串"This is a string",那么生成的串行化的值是 s:16:"This is a string"; s是string,代表类型,中间的16就是该字符串的长度,如果是中文的话,那么每个中文是两个字符来保存的,比如字符串 "我是变量",生成的串行化值是:s:8:"我是变量"; 就是8个字符的长度。

  下面我们重点来讲一下数组变量串行化。

  数组变量:

$var = array("abc", "def", "xyz", "123");
echo serialize($var);

  输出:

a:4:{i:0;s:3:"abc";i:1;s:3:"def";i:2;s:3:"xyz";i:3;s:3:"123";}

  就是把我的数组 $var 串行化得到的字符串值,我们的$var数组包括4个字符串元素,分别是"abc", "def", "xyz", "123",我们来分析一下串行化后的数据,为了简便起见,我们把串行化的数据列成数组的样式:

a:4:
{
i:0;s:3:"abc";
i:1;s:3:"def";
i:2;s:3:"xyz";
i:3;s:3:"123";
}

  这样排列就比较清晰了,看开始的字符串:a:4:{...} 首先第一个字符a保存的是变量类型是array(数组)类型,第二个 4 保存的是数组元素的个数,一共有4个,然后在{}之间数组元素的内容。比如第一个数组元素:i:0;s:3:"abc"; i代表是当前数组元素的索引值类型是整型,并且值是 0,元素值的类型是s(字符串的),个数是 3 个,具体值是"abc",分号结束,下面的数组元素依次类推。

  我们再看看使用字符串做为元素索引会如何:

$var = array("index1"=>"abc", "index2"=>"def", "index3"=>"xyz", "index4"=>"123");
echo serialize($var);

  输出:

a:4:{s:6:"index1";s:3:"abc";s:6:"index2";s:3:"def";s:6:"index3";s:3:"xyz";s:6:"index4";s:3:"123";}

  变成数组样式后:

a:4:
{
 s:6:"index1";s:3:"abc";
 s:6:"index2";s:3:"def";
 s:6:"index3";s:3:"xyz";
 s:6:"index4";s:3:"123";
}

  其实跟上面没有太大区别,不过是开始的索引变成了保存字符串的形式,比如第一个元素:s:6:"index1";s:3:"abc";第一项就是索引值:s:6:"index1"; s是类型,6是索引字符串的长度,"index1"就是索引的值。后面的s:3:"abc"; 就是元素值,这个好理解,就不讲了。

  从上面来看,我们大致了解了基本数据类型的串行化,其实我们完全可以构造自己的串行化功能,或者从这个角度去扩展,开发自己的串行化程序,便于我们的变量交换。

  當然,其實我們也可以利用這個功能,把數組或任意其他變數串列化成字串,然後透過curl功能來模擬GET/POST功能,達到能夠無用使用者執行動作就從遠端伺服器取得資料的功能。

  二、物件序列化

  物件的序列化也是一個比較普遍的功能,能夠把一個物件進行串列化以後變成一個字串,能夠保存或傳輸。

  我們先來看一個例子:

class TestClass
{
 var $a;
 var $b;

  $this->a = "This is a";
  $this->b = "This is b";
  $this->b = "This is b";
 function getA()
 {

  return $this->a;

 }

 function getB()
 {

  return $this->b;

 }
}

$obj = new TestClass;
$str = serialize($obj);

echo $str;


  輸出結果:

O:9:"TestClass":2:{s:1:"a";s:9:"This is a";s:1:"b";s:9:"This is b"; }

  我們來分析一個物件串列化之後的字串。

O:9:"TestClass":2:

{

 s:1:"a";s:9:"This is a";

 s:1:"b";s :9:"This is b";
}

  先看對於物件本身的內容:O:9:"TestClass":2:O是說明這是一個物件類型(object),然後9是代表物件的名字查過濃度,2是代表該物件有幾個屬性。在看兩個屬性的內容:

  s:1:"a";s:9:"This is a"; 其實跟數組的內容比較類似,第一項:s:1:"a"; 是描述屬性名稱的,第二項s:9:"This is a"; 是描述屬性值的。後面的屬性類似。

  先說一種物件序列化的應用,下面的內容是PHP手冊上,沒有更改原文。

  serialize() 傳回一個字串,包含著可以儲存於 PHP 的任何值的位元組流表示。 unserialize() 可以用此字串來重建原始的變數值。用序列化來保存物件可以保存物件中的所有變數。物件中的函數不會被保存,只有類別的名稱。

  要能夠 unserialize() 一個對象,需要定義該對象的類別。也就是,如果序列化了 page1.php 中類別 A 的物件 $a,將會得到一個指向類別 A 的字串並包含有所有 $a 中變數的值。如果要在 page2.php 中將其解序列化,重建類別 A 的物件 $a,則 page2.php 中必須出現類別 A 的定義。這可以例如這樣實現,將類別 A 的定義放在包含檔案中,並在 page1.php 和 page2.php 都包含此檔案。

<?php

// classa.inc:

class A

{
 var $one = 1;

 function show_one()
 {

  echo $this->one;

 }
}

// page1.php:
include("classa.inc");

$a = new A;
$s = serialize($a);

// 將$s 存放在某處使page2.php 能夠找到

$fp = fopen("store" , "w");
fputs($fp, $s);
fclose($fp);

// page2.php:
// 為了正常解序列化需要這一行

include("classa.inc");


$s = implode("", @file("store"));
$a = unserialize($s);

// 現在可以用 $a 物件的 show_one() 函數了
$a->show_one();

?>


  如果在用會話並使用了 session_register() 來註冊對象,這些對象會在每個 PHP 頁面結束時被自動序列化,並在接下來的每個頁面中自動解序列化。基本上是說這些物件一旦成為會話的一部分,就能在任何頁面中出現。

  強烈建議在所有的頁面中都包括這些註冊的物件的類別的定義,即使並不是在所有的頁面中都用到了這些類別。如果沒有這樣做,一個物件被解序列化了但卻沒有其類別的定義,它將失去與之關聯的類別並成為 stdClass 的一個物件而完全沒有任何可用的函數,這樣就很沒有用處。

  因此如果在以上的例子中 $a 透過運行 session_register("a") 成為了會話的一部分,應該在所有的頁面中包含 classa.inc 文件,而不只是page1.php 和 page2.php。

  當然,其實序列化物件其實完全可以應用在很多地方。當然,在PHP 5中對序列化的處理不一樣了,我們看一下手冊中的說法:

  serialize() 檢查類別中是否有魔術名稱 __sleep 的函數。如果這樣,函數將在任何序列化之前運行。它可以清除物件並應該傳回一個包含有該物件中應被序列化的所有變數名的陣列。

  使用 __sleep 的目的是關閉物件可能具有的任何資料庫連接,提交等待中的資料或進行類似的清除任務。此外,如果有非常大的物件而並不需要完全儲存下來時此函數也很有用。

  相反地,unserialize() 檢查具有魔術名稱 __wakeup 的函數的存在。如果存在,此函數可以重建物件可能具有的任何資源。

  使用 __wakeup 的目的是重建在序列化中可能丟失的任何資料庫連接以及處理其它重新初始化的任務。

www.bkjia.comtruehttp: //www.bkjia.com/PHPjc/313909.htmlTechArticle串列化大概就是把一些變數轉換成字串的位元組流的形式,這樣比較容易傳輸、儲存。當然,關是傳輸儲存沒有什麼,關鍵是變成串的形...
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
4 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

適用於 Ubuntu 和 Debian 的 PHP 8.4 安裝和升級指南 適用於 Ubuntu 和 Debian 的 PHP 8.4 安裝和升級指南 Dec 24, 2024 pm 04:42 PM

PHP 8.4 帶來了多項新功能、安全性改進和效能改進,同時棄用和刪除了大量功能。 本指南介紹如何在 Ubuntu、Debian 或其衍生版本上安裝 PHP 8.4 或升級到 PHP 8.4

CakePHP 日期和時間 CakePHP 日期和時間 Sep 10, 2024 pm 05:27 PM

為了在 cakephp4 中處理日期和時間,我們將使用可用的 FrozenTime 類別。

討論 CakePHP 討論 CakePHP Sep 10, 2024 pm 05:28 PM

CakePHP 是 PHP 的開源框架。它旨在使應用程式的開發、部署和維護變得更加容易。 CakePHP 基於類似 MVC 的架構,功能強大且易於掌握。模型、視圖和控制器 gu

CakePHP 檔案上傳 CakePHP 檔案上傳 Sep 10, 2024 pm 05:27 PM

為了進行文件上傳,我們將使用表單助理。這是文件上傳的範例。

CakePHP 建立驗證器 CakePHP 建立驗證器 Sep 10, 2024 pm 05:26 PM

可以透過在控制器中新增以下兩行來建立驗證器。

如何設定 Visual Studio Code (VS Code) 進行 PHP 開發 如何設定 Visual Studio Code (VS Code) 進行 PHP 開發 Dec 20, 2024 am 11:31 AM

Visual Studio Code,也稱為 VS Code,是一個免費的原始碼編輯器 - 或整合開發環境 (IDE) - 可用於所有主要作業系統。 VS Code 擁有大量針對多種程式語言的擴展,可以輕鬆編寫

CakePHP 快速指南 CakePHP 快速指南 Sep 10, 2024 pm 05:27 PM

CakePHP 是一個開源MVC 框架。它使應用程式的開發、部署和維護變得更加容易。 CakePHP 有許多函式庫可以減少大多數常見任務的過載。

您如何在PHP中解析和處理HTML/XML? 您如何在PHP中解析和處理HTML/XML? Feb 07, 2025 am 11:57 AM

本教程演示瞭如何使用PHP有效地處理XML文檔。 XML(可擴展的標記語言)是一種用於人類可讀性和機器解析的多功能文本標記語言。它通常用於數據存儲

See all articles