當前位置:首頁 » 編程語言 » php串列化

php串列化

發布時間: 2022-04-28 15:41:31

php數組裡面存放對象

樓上解釋正確,不過我補充一下。
既然初始化是在類聲明之後,那麼可以通過手動串列化和反串列化來達到目的。
保存的時候使用serialize來保存,提取恢復的時候使用unserialize來恢復。
當然,這個還有一個要注意的地方,需要保存的對象最好是只包含數據,意思是,不要有資料庫連接資源、文件資源之類的,如果包含這些,串列和反串列的結果都是一個int 0,反串列的時候可能不能正常工作。
至於對象串列反串列的一些可定製的功能,可以參考幫助文檔的這個部分:
http://dk2.php.net/manual/zh/language.oop.magic-functions.php
通過定義魔術函數__sleep __wakeup來實現。

⑵ serialize可以串列化數組么

這個問題要界定編程語言和編程環境。
對PHP來說,數組可以序列化(串列化),沒有問題。
對C++來說,數組不是對象,不能直接進行序列化操作,如果有序列化對象(如ar),可以逐一序列化數組。

⑶ 請寫出php變數序列化和反序列化的函數,並舉出1個應用例子

PHP中的序列化和反序列化分別通過函數serialize()和unserialize()即可實現。serialize()的參數可以是resource類型外的所有變數類型,最常見的是用來序列化對象,unseialize()將serialize的返回結果作為參數,進行反序列化,得到原對象。$str = serialize ($obj);...$obj222 = unserialize($str);現在可以用$object222對象來執行該對象可以執行的各種操作。在用serialize序列化對象時,會自動調用__sleep方法,__sleep方法必須返回一個數組,包含需要串列化的屬性。 PHP會拋棄其它屬性的值, 如果沒有__sleep方法,PHP將保存所有屬性,包括private屬性。用unserialize反序列化對象時,PHP 會調用__wakeup方法。__sleep和__wakeup方法可以根據實際需要,都添加上,也可以只要其中的一個,當然也可以都不要。下面給出一個序列化的代碼:共serialize.php和unserialize.php兩個文件。// serialize.php<?php
class User
{
private $name;
private $id;
public $sex="F";

function __construct()
{
//give user a unique ID 賦予一個不同的ID
$this->id = uniqid();
}

function __sleep()
{
//do not serialize this->id 不串列化id
return(array("name","sex"));
}

function __wakeup()
{
//give user a unique ID
$this->id = uniqid();
}

function p(){
echo "in function p() \t";
return $this->name;
}
function setname($name){
$this->name = $name;
}
} //create object 建立一個對象
$u = new User;
$u->setname("pphu");
//serialize it 串列化
$s = serialize($u);
echo "in serialize.php <br/>";
print_r($s);
echo "<br/>";
print_r($u);
echo "<br/><br/>";
?> //// unserialize.php<?php
include('serialize.php');
//global $s;
$u2 = unserialize($s);
echo "in unserialize.php<br/>";
echo $u2->p()."<br/>";
echo $u2->sex."<br/>";
print_r($u2);
?>

⑷ php 對象串列化(序列化)到底有什麼用

如果使用URL傳值的話,一些特殊字元比如含有&的字元串,分為兩個參數,例如?a=bb&cc,這樣你使用GET的得到a的參數就是bb,而不是bb&cc。我理解的序列化還有就是加密,序列化之後你傳值的參數用戶不易知道是什麼。希望能幫到你!

⑸ session問題呀!

由於 Session 是以文本文件形式存儲在伺服器端的,所以不怕客戶端修改 Session 內容。實際上在伺服器端的 Session 文件,PHP 自動修改 Session 文件的許可權,只保留了系統讀和寫許可權,而且不能通過 ftp 修改,所以安全得多。

對於 Cookie 來說,假設我們要驗證用戶是否登陸,就必須在 Cookie 中保存用戶名和密碼(可能是 md5 加密後字元串),並在每次請求頁面的時候進行驗證。如果用戶名和密碼存儲在資料庫,每次都要執行一次資料庫查詢,給資料庫造成多餘的負擔。因為我們並不能只做一次驗證。為什麼呢?因為客戶端 Cookie 中的信息是有可能被修改的。假如你存儲 $admin 變數來表示用戶是否登陸,$admin 為 true 的時候表示登陸,為 false 的時候表示未登錄,在第一次通過驗證後將 $admin 等於 true 存儲在 Cookie,下次就不用驗證了,這樣對么?錯了,假如有人偽造一個值為 true 的 $admin 變數那不是就立即取的了管理許可權么?非常的不安全。

而 Session 就不同了,Session 是存儲在伺服器端的,遠程用戶沒辦法修改 Session 文件的內容,因此我們可以單純存儲一個 $admin 變數來判斷是否登陸,首次驗證通過後設置 $admin 值為 true,以後判斷該值是否為 true,假如不是,轉入登陸界面,這樣就可以減少很多資料庫操作了。而且可以減少每次為了驗證 Cookie 而傳遞密碼的不安全性了(Session 驗證只需要傳遞一次,假如你沒有使用 SSL 安全協議的話)。即使密碼進行了 md5 加密,也是很容易被截獲的。

當然使用 Session 還有很多優點,比如控制容易,可以按照用戶自定義存儲等(存儲於資料庫)。我這里就不多說了。

Session 在 php.ini 是否需要設置呢?一般不需要的,因為並不是每個人都有修改 php.ini 的許可權,默認 Session 的存放路徑是伺服器的系統臨時文件夾,我們可以自定義存放在自己的文件夾里,這個稍後我會介紹。

開始介紹如何創建 Session。非常簡單,真的。

啟動 Session 會話,並創建一個 $admin 變數:

<?php
// 啟動 Session
session_start();
// 聲明一個名為 admin 的變數,並賦空值。
$_SESSION["admin"] = null;
?>

如果你使用了 Seesion,或者該 PHP 文件要調用 Session 變數,那麼就必須在調用 Session 之前啟動它,使用 session_start() 函數。其它都不需要你設置了,PHP 自動完成 Session 文件的創建。

執行完這個程序後,我們可以到系統臨時文件夾找到這個 Session 文件,一般文件名形如:sess_,後面是 32 位編碼後的隨機字元串。用編輯器打開它,看一下它的內容:

admin|N;

一般該內容是這樣的結構:

變數名|類型:長度:值;

並用分號隔開每個變數。有些是可以省略的,比如長度和類型。

我們來看一下驗證程序,假設資料庫存儲的是用戶名和 md5 加密後的密碼:

login.php

<?php

// 表單提交後...
$posts = $_POST;
// 清除一些空白符號
foreach ($posts as $key => $value)
{
$posts[$key] = trim($value);
}
$password = md5($posts["password"]);
$username = $posts["username"];

$query = "SELECT `username` FROM `user` WHERE `password` = '$password'";
// 取得查詢結果
$userInfo = $DB->getRow($query);

if (!empty($userInfo))
{
if ($userInfo["username"] == $username)
{
// 當驗證通過後,啟動 Session
session_start();
// 注冊登陸成功的 admin 變數,並賦值 true
$_SESSION["admin"] = true;
}
else
{
die("用戶名密碼錯誤");
}
}
else
{
die("用戶名密碼錯誤");
}

?>

我們在需要用戶驗證的頁面啟動 Session,判斷是否登陸:

<?php

// 防止全局變數造成安全隱患
$admin = false;

// 啟動會話,這步必不可少
session_start();

// 判斷是否登陸
if (isset($_SESSION["admin"]) && $_SESSION["admin"] === true)
{
echo "您已經成功登陸";
}
else
{
// 驗證失敗,將 $_SESSION["admin"] 置為 false
$_SESSION["admin"] = false;
die("您無權訪問");
}

?>

是不是很簡單呢?將 $_SESSION 看成是存儲在伺服器端的數組即可,我們注冊的每一個變數都是數組的鍵,跟使用數組沒有什麼分別。

如果要登出系統怎麼辦?銷毀 Session 即可。

<?php

session_start();
// 這種方法是將原來注冊的某個變數銷毀
unset($_SESSION["admin"]);

// 這種方法是銷毀整個 Session 文件
session_destroy();

?>

Session 能否像 Cookie 那樣設置生存周期呢?有了 Session 是否就完全拋棄 Cookie 呢?我想說,結合 Cookie 來使用 Session 才是最方便的。

Session 是如何來判斷客戶端用戶的呢?它是通過 Session ID 來判斷的,什麼是 Session ID,就是那個 Session 文件的文件名,Session ID 是隨機生成的,因此能保證唯一性和隨機性,確保 Session 的安全。一般如果沒有設置 Session 的生存周期,則 Session ID 存儲在內存中,關閉瀏覽器後該 ID 自動注銷,重新請求該頁面後,重新注冊一個 Session ID。

如果客戶端沒有禁用 Cookie,則 Cookie 在啟動 Session 會話的時候扮演的是存儲 Session ID 和 Session 生存期的角色。

我們來手動設置 Session 的生存期:

<?php

session_start();
// 保存一天
$lifeTime = 24 * 3600;
setcookie(session_name(), session_id(), time() + $lifeTime, "/");

?>

其實 Session 還提供了一個函數 session_set_cookie_params(); 來設置 Session 的生存期的,該函數必須在 session_start() 函數調用之前調用:

<?php

// 保存一天
$lifeTime = 24 * 3600;
session_set_cookie_params($lifeTime);
session_start();
$_SESSION["admin"] = true;

?>

如果客戶端使用 IE 6.0 , session_set_cookie_params(); 函數設置 Cookie 會有些問題,所以我們還是手動調用 setcookie 函數來創建 cookie。

假設客戶端禁用 Cookie 怎麼辦?沒辦法,所有生存周期都是瀏覽器進程了,只要關閉瀏覽器,再次請求頁面又得重新注冊 Session。那麼怎麼傳遞 Session ID 呢?通過 URL 或者通過隱藏表單來傳遞,PHP 會自動將 Session ID 發送到 URL 上,URL 形如:http://www.openphp.cn/index.php?PHPSESSID=,其中 URL 中的參數 PHPSESSID 就是 Session ID了,我們可以使用 $_GET 來獲取該值,從而實現 Session ID 頁面間傳遞。

<?php

// 保存一天
$lifeTime = 24 * 3600;
// 取得當前 Session 名,默認為 PHPSESSID
$sessionName = session_name();
// 取得 Session ID
$sessionID = $_GET[$sessionName];
// 使用 session_id() 設置獲得的 Session ID
session_id($sessionID);

session_set_cookie_params($lifeTime);
session_start();
$_SESSION["admin"] = true;

?>

對於虛擬主機來說,如果所有用戶的 Session 都保存在系統臨時文件夾里,將給維護造成困難,而且降低了安全性,我們可以手動設置 Session 文件的保存路徑,session_save_path() 就提供了這樣一個功能。我們可以將 Session 存放目錄指向一個不能通過 Web 方式訪問的文件夾,當然,該文件夾必須具備可讀寫屬性。

<?php

// 設置一個存放目錄
$savePath = "./session_save_dir/";
// 保存一天
$lifeTime = 24 * 3600;
session_save_path($savePath);
session_set_cookie_params($lifeTime);
session_start();
$_SESSION["admin"] = true;

?>

同 session_set_cookie_params(); 函數一樣,session_save_path() 函數也必須在 session_start() 函數調用之前調用。

我們還可以將數組,對象存儲在 Session 中。操作數組和操作一般變數沒有什麼區別,而保存對象的話,PHP 會自動對對象進行序列化(也叫串列化),然後保存於 Session 中。下面例子說明了這一點:

person.php

<?php
class person
{
var $age;
function output() {
echo $this->age;
}

function setAge($age) {
$this->age = $age;
}
}
?>

setage.php

<?php

session_start();
require_once "person.php";
$person = new person();
$person->setAge(21);
$_SESSION['person'] = $person;
echo "<a href='output'>check here to output age</a>";

?>

output.php

<?

// 設置回調函數,確保重新構建對象。
ini_set('unserialize_callback_func', 'mycallback');
function mycallback($classname) {
include_once $classname . ".php";
}
session_start();
$person = $_SESSION["person"];
// 輸出 21
$person->output();

?>

當我們執行 setage.php 文件的時候,調用了 setage() 方法,設置了年齡為 21,並將該狀態序列化後保存在 Session 中(PHP 將自動完成這一轉換),當轉到 output.php 後,要輸出這個值,就必須反序列化剛才保存的對象,又因為在解序列化的時候需要實例化一個未定義類,所以我們定義了以後回調函數,自動包含 person.php 這個類文件,因此對象被重構,並取得當前 age 的值為 21,然後調用 output() 方法輸出該值。

另外,我們還可以使用 session_set_save_handler 函數來自定義 Session 的調用方式。

出處
http://www.openphp.cn/index.php/article/13/73/index.html

⑹ PHP5的PHP特點

字元串與數組處理
字元串和數組是所有計算機編程語言中最基本的數據結構。在各種語言中,對這兩種數據結構的支持是完善的,PHP也是如此。作為一種面向Web開發的程序語言,PHP也有著自己的獨特性。
PHP有著簡單易用和功能強大的特點,這完全要歸功於其開放的模塊化設計。在基於Zend引擎的支持和優化下,各種各樣的擴展模塊,其功能已經覆蓋幾乎所有的Web應用。
URL的處理
利用URL函數庫,PHP可以用簡單的方法對URL地址進行解碼或編碼。而在此之前,需要編寫一組代碼加以實現。
正則表達式
正則表達式是一種強大的字元串分析工具。正則表達式早期僅用於UNIX系統程序,現在已經被絕大多數系統,程序所支持。隨著正則表達式移植到交叉平台的程序語言的發展,其功能也日益完善。
單詞拼寫的處理
利用單詞拼寫檢查庫PSpell,PHP可以像Word中的「單詞拼寫檢查」一樣,對文本中的錯誤拼寫進行指正。盡管這不常用,但對於某些場合(如輔助編輯進行校勘),這種處理是非常有益的。
數據的串列化
使用serialize()及unserialize()等函數,可以將數組、對象等數據進行序列化編碼,從而方便其在資料庫或會話周期中的存儲。另外,利用WDDX(分布式數據格式)串列化數據,可以在應用環境中交換更為復雜的數據結構。
對不同類型文件的支持
PHP不僅僅局限於HTML和文本文件的處理,也可以符合特定格式的文件進行快速處理。例如對於CVS(逗號分隔文件)、INI(Windows配置文件)以及XML文件,PHP中都有專用的解析函數。除了上述文本文件,PHP還提供可以讀取 ZIP文件的zlib壓縮文件庫。
PHP能夠非常簡便的輸出文本,如XHTML以及任何其他形式的XML文件。PHP還能動態的輸出圖像(GD2庫)、PDF文件(PDFLib庫)甚至Flash動畫(LibSWF和Ming庫)。在Windows系統中,PHP能夠在伺服器端開辟出一塊動態的緩存空間,從而直接列印這些文件(使用Printer擴展)。
簡便的資料庫操作
PHP最顯著的特徵之一,是它支持很大范圍的資料庫系統。用戶會發現,利用PHP編寫基於資料庫支持的動態網頁簡單得難以置信。目前,PHP支持如表1-1所示的資料庫系統。
表1-1 PHP支持的資料庫系統
Adabas D dBase Empress
FilePro(只讀) Hyperwave IBM DB2
Informix Ingres InterBase
FrontBase MSQL Direct MS-SQL
MySQL ODBC Oracle
Ovrimos PostgreSQL SQLite
Solid Sybase Velocis
UXIX dbm
目錄與文件的操作
文件系統是操作系統的主要組成部分,是數據存儲的基本單元。利用目錄和文件函數,PHP可以對本地文件系統進行直接操作,如對文件或目錄進行的創建、刪除和讀取操作,也可以對其所有者許可權、組別等信息進行查詢和變更操作。
當激活了phpini文件中的「allow_url_fopen」選項後,利用簡單的 fopen()或fwrite()等函數就可以對遠程文件進行操作。例如:程序可以讀取或下載遠程Web伺服器的文件;對於具有適當許可權的用戶,還可以登錄遠程FTP伺服器進行數據的保存或下載操作,甚至可以使用syslog()函數進行分布式日誌的管理和維護。

⑺ php 哪些放法實現數組的串列化

常用的環境有下面兩種:
1)數據通信,不同的站點之間的數據通信,例如A站點去取B站點的某些數據,返回數據用serialize後作為字元串傳輸,接收方unserialize一下即可還原成實際的數據
2)數據存儲,同樣的,也是為了作為字元串,將變數的值存儲到 文件/資料庫 裡面,當需要用到的時候取出來處理一下即可~~

總結一下:serialize的主要作用是為了數據共享和傳輸,將一些數據共享給其他文件或者站點~~

⑻ 反串列化為什麼能使析構方法自動調用

你說的是對的,函數運行在棧上局部對象也創建在棧上,函數結束也就是棧退出時局部對象會自動調用析構函數,如果是new的對象那麼是在堆上的就不會自動析構需要調用delete。另外即使是堆上的對象經過特殊封裝也可以讓它自動釋放,所謂的auto_release

⑼ 什麼是對象的串列化

串列化可以把變數包括對象,轉化成連續bytes數據. 你可以將串列化後的變數存在一個文件里或在網路上傳輸. 然後再反串列化還原為原來的數據. 你在反串列化類的對象之前定義的類,PHP可以成功地存儲其對象的屬性和方法. 有時你可能需要一個對象在反串列化後立即執行. 為了這樣的目的,PHP會自動尋找__sleep和__wakeup方法.

當一個對象被串列化,PHP會調用__sleep方法(如果存在的話). 在反串列化一個對象後,PHP 會調用__wakeup方法. 這兩個方法都不接受參數. __sleep方法必須返回一個數組,包含需要串列化的屬性. PHP會拋棄其它屬性的值. 如果沒有__sleep方法,PHP將保存所有屬性.

例子6.16顯示了如何用__sleep和__wakeup方法來串列化一個對象. Id屬性是一個不打算保留在對象中的臨時屬性. __sleep方法保證在串列化的對象中不包含id屬性. 當反串列化一個User對象,__wakeup方法建立id屬性的新值. 這個例子被設計成自我保持. 在實際開發中,你可能發現包含資源(如圖像或數據流)的對象需要這些方法.

⑽ PHP緩存技術的PHP緩存類型

1、資料庫數據緩存技術:
數據緩存:這里所說的數據緩存是指資料庫查詢PHP緩存機制,每次訪問頁面的時候,都會先檢測相應的緩存數據是否存在,如果不存在,就連接資料庫,得到數據,並把查詢結果序列化後保存到文件中,以後同樣的查詢結果就直接從緩存表或文件中獲得。
用的最廣的例子看Discuz的搜索功能,把結果ID緩存到一個表中,下次搜索相同關鍵字時先搜索緩存表。和memcache技術。
舉個常用的方法,多表關聯的時候,把附表中的內容生成數組保存到主表的一個欄位中,需要的時候數組分解一下,這樣的好處是只讀一個表,壞處就是兩個數據同步會多不少步驟,資料庫永遠是瓶頸,用硬碟換速度,是這個的關鍵點。
常用的資料庫數據緩存技術有:
1.序列化(串列化)緩存
2.JSON緩存
3.XML緩存
4.Array緩存
2、頁面緩存:
每次訪問頁面的時候,都會先檢測相應的緩存頁面文件是否存在,如果不存在,就連接資料庫,得到數據,顯示頁面並同時生成緩存頁面文件,這樣下次訪問的時候頁面文件就發揮作用了。(模板引擎和網上常見的一些PHP緩存機制類通常有此功能,例如smarty模板、thinkphp框架)

熱點內容
安卓市場手機版從哪裡下載 發布:2025-05-15 20:17:28 瀏覽:813
幼兒速演算法 發布:2025-05-15 20:15:08 瀏覽:86
best把槍密碼多少 發布:2025-05-15 20:13:42 瀏覽:547
android安裝程序 發布:2025-05-15 20:13:20 瀏覽:559
c語言跳出死循環 發布:2025-05-15 20:06:04 瀏覽:824
a19處理器相當於安卓哪個水平 發布:2025-05-15 20:05:29 瀏覽:639
榮耀9i安卓強行關機按哪個鍵 發布:2025-05-15 20:00:32 瀏覽:750
密碼鎖寫什麼最好 發布:2025-05-15 19:05:31 瀏覽:782
5的源碼是 發布:2025-05-15 19:04:07 瀏覽:719
c語言創建的源文件 發布:2025-05-15 18:54:08 瀏覽:611