PHP串行化與JSON
原文連接:http://hi.baidu.com/lostdays/blog/item/8d76c300ec4e3c15738b65fa.html
總目錄
What 、Why、How
What; Why; How
PHP串行化語法; PHP串行化實(shí)例; 在JavaScript中串行化為JSON—使用json2.js; 在JavaScript中串行化為JSON—使用prototype.js
PHP與JSON
json_decode函數(shù); json_encode函數(shù); json_decode函數(shù)實(shí)例; json_encode函數(shù)實(shí)例
實(shí)踐出真知
背景說明; 前臺(tái)JavaScript部分; 后臺(tái)PHP部分
What 、Why、How
What
Ok,各位親愛的朋友,讓我們開始這個(gè)新概念的旅程,串行化這個(gè)話題可能大家以前都沒有多加關(guān)注,事情其實(shí)起源于那天我隨便翻翻PHP手冊(cè),發(fā)現(xiàn)這個(gè)串行化的函數(shù),之后閑來無聊又做一個(gè)WordPress的插件,這個(gè)時(shí)候順便用了一下串行化,發(fā)現(xiàn)在某些場(chǎng)合的確非常方便。
先來解釋下串行化:簡(jiǎn)單來說,串行化即將變量轉(zhuǎn)換成字節(jié)流的過程。串行化的提出,有效的解決了對(duì)象的保存和傳輸?shù)膯栴},舉例來說,我在JavaScript 中建立了一個(gè)對(duì)象,我現(xiàn)在想將這個(gè)對(duì)象保存到服務(wù)器端的數(shù)據(jù)庫(kù)中,那么我如何進(jìn)行操作呢,這個(gè)時(shí)候往往就用到了對(duì)象的串行化。在JavaScript的串行化中不得不提JSON,JSON(JavaScript Object Notation) 是一種輕量級(jí)的數(shù)據(jù)交換格式。易于人閱讀和編寫,同時(shí)也易于機(jī)器解析和生成。它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一個(gè)子集。 JSON采用完全獨(dú)立于語言的文本格式,但是也使用了類似于C語言家族的習(xí)慣(包括C, C++, C#, Java, JavaScript, Perl, Python等)。這些特性使JSON成為理想的數(shù)據(jù)交換語言。
人們通常將JSON和XML進(jìn)行比較,二者都是將對(duì)象扁平化(稍后我們解釋這個(gè)“扁平化”)的一種手段,XML的特點(diǎn)是結(jié)構(gòu)嚴(yán)謹(jǐn),而JSON的特點(diǎn)則是簡(jiǎn)單易讀、容易使用程序進(jìn)行分析,因?yàn)樗軌蚝芎?jiǎn)單的將一個(gè)對(duì)象轉(zhuǎn)換為一個(gè)字符流的形式,例如如下代碼:
代碼:
{'type':'human','name':'hanguofeng','age':22}
則是一個(gè)JSON表達(dá)式,他保存了一個(gè)對(duì)象,我們?nèi)绾螌⑺謴?fù)為對(duì)象呢?很簡(jiǎn)單,如下:
代碼:
var animal_str = '{'type':'human','name':'hanguofeng','age':22}';var animal2=eval('(' + animal_str + ')');
我們通過JavaScript的求值函數(shù),將JSON表達(dá)式進(jìn)行運(yùn)算,并返回值,用以獲得一個(gè)對(duì)象,到這里,我想你一定會(huì)和我一樣,對(duì)JSON格式的創(chuàng)造者的思維佩服不已吧。本來說講串行化的,“不小心”談到JSON,并且講了這么多,呵呵,跑題了嗎?沒有,PHP的串行化和JSON是非常像的,一個(gè)PHP的串行化表達(dá)式如下:
代碼:a:3:{s:4:'type';s:5:'human';s:4:'name';s:10:'hanguofeng';s:3:'age';s:2:'20';}他看起來結(jié)構(gòu)和JSON有些類似,實(shí)際上,這個(gè)表達(dá)式是如下數(shù)組的串行化結(jié)果:代碼:$animal =array('type' => 'human','name' => 'hanguofeng','age'=> '20');OK,上面的一些介紹只是讓你大致看到串行化和JSON是什么樣的東西,你無須對(duì)這里的代碼過分糾結(jié),我們?cè)诤竺鏁?huì)詳細(xì)講解的,下面我們來談?wù)劄槭裁匆褂么谢?/P>
Why
串行化首先是作為數(shù)據(jù)傳輸?shù)姆奖愣霈F(xiàn)的,正如本文開始我提出的問題,我在JavaScript中建立了一個(gè)對(duì)象,我現(xiàn)在想將這個(gè)對(duì)象保存到服務(wù)器端的數(shù)據(jù)庫(kù)中,應(yīng)該如何做,這其實(shí)上是一個(gè)“我如何將一個(gè)對(duì)象從瀏覽器提交到服務(wù)器”的問題,在這個(gè)傳輸過程中,我們知道,實(shí)際上只能夠傳遞字符流,字符流是一維(扁平)的,然而很多對(duì)象卻是多維的,如果要傳遞的對(duì)象是一個(gè)字符串,那么很簡(jiǎn)單,我們直接將其作為傳遞的內(nèi)容就可以了,如果要傳遞的對(duì)象是一個(gè)數(shù)組或者其他的結(jié)構(gòu)呢,我們就需要用字符流來描述他,就比如在電話里面,我問你的名字是什么,你會(huì)告訴我,你的名字是張三、李四,而我問你,你的長(zhǎng)相如何呢,你就需要用文字向我描述了,我們進(jìn)行數(shù)據(jù)傳遞的媒介往往和這條電話線路一樣,只能傳遞字符流,而我們描述對(duì)象的過程,實(shí)際上就是串行化的過程。
另外,串行化也可以用于對(duì)對(duì)象的持久化存儲(chǔ),也許你曾經(jīng)也和我一樣,想著在數(shù)據(jù)庫(kù)的某一個(gè)字段中存儲(chǔ)一個(gè)對(duì)象,現(xiàn)在我們可以非常簡(jiǎn)單的做到這一點(diǎn),并且,你的這個(gè)數(shù)據(jù)庫(kù)字段不需要設(shè)定為特殊格式,設(shè)定為 varchar就可以了(當(dāng)然,如果對(duì)象很大,你可能需要設(shè)定為text)。
How
PHP串行化語法
好了,我想What和Why的問題你都了解了,本節(jié)最后我們來講點(diǎn)理論性強(qiáng)一些的內(nèi)容,就是如何使用PHP串行化和反串行化數(shù)據(jù),如何將JavaScript對(duì)象串行化(即變?yōu)镴SON格式)和如何將其反串行化,最后則是如何將JSON和PHP的串行化建立關(guān)系。
PHP為我們提供了兩個(gè)函數(shù),用來進(jìn)行串行化和反串行化的操作,這兩個(gè)函數(shù)分別是:serialize()和unserialize(),他們適用于PHP4和PHP5,下面分別進(jìn)行講解:
serialize()
(PHP 4, PHP 5, PECL axis2:0.1.0-0.1.1)serialize — 獲得一個(gè)可存儲(chǔ)的表述值
說明
string serialize ( mixed $value )獲得一個(gè)可存儲(chǔ)的表述值本函數(shù)用于無損的存儲(chǔ)或者傳遞PHP變量值和結(jié)構(gòu)。如果需要將已經(jīng)串行化的值轉(zhuǎn)回PHP變量,可以使用unserialize()函數(shù)。
參數(shù)
value即被串行化的表達(dá)式。serialize()處理除資源指針之外的所有類型,你甚至可以將含有指向自身元素的數(shù)組串行化。你串行化的含有循環(huán)指向的數(shù)組或者對(duì)象一樣會(huì)被存儲(chǔ),其他的指向則會(huì)丟失。當(dāng)串行化對(duì)象時(shí),PHP會(huì)嘗試首先調(diào)用其成員函數(shù)__sleep()。這將允許對(duì)象在被串行化之前進(jìn)行諸如最后的清理工作等。同樣地,當(dāng)使用unserialize()函數(shù)將對(duì)象恢復(fù)時(shí),會(huì)調(diào)用成員函數(shù)__wakeup()。
返回值
返回一個(gè)可以被存儲(chǔ)在任何地點(diǎn)的包含對(duì)象的字節(jié)流表達(dá)式的字符串。
unserialize()
(PHP 4, PHP 5, PECL axis2:0.1.0-0.1.1)unserialize — 從一個(gè)已存儲(chǔ)的表達(dá)式中獲得一個(gè)PHP變量值
說明
mixed unserialize ( string $str )unserialize()獲取一個(gè)簡(jiǎn)單類型的串行化變量并將其轉(zhuǎn)換回PHP變量值。
參數(shù)
str
串行化后的字符串如果被反串行化的變量是一個(gè)對(duì)象,則成功恢復(fù)該對(duì)象的結(jié)構(gòu)后,PHP將自動(dòng)嘗試執(zhí)行該對(duì)象的__wakeup()成員函數(shù)(如果其存在)。unserialize_callback_func 指令:你可以設(shè)定在此過程中唄執(zhí)行的回調(diào)函數(shù),如果某個(gè)未被定義的類應(yīng)當(dāng)在反串行化時(shí)被實(shí)例化(以避免獲得一個(gè)不完全的對(duì)象 “__PHP_Incomplete_Class”)。你可以使用php.ini,ini_set()或者.htaccess來定義 “unserialize_callback_func”。當(dāng)一個(gè)未被定義的類被實(shí)例化時(shí),它會(huì)被調(diào)用。屏蔽這個(gè)特性只需將其設(shè)為空即可。
返回值
返回轉(zhuǎn)換后的數(shù)值,可能是布爾變量、實(shí)數(shù)、浮點(diǎn)數(shù)、字符串、數(shù)組或者對(duì)象。假如傳入的字符串不可以被反串行化,則返回FALSE,同時(shí)拋出NOTICE錯(cuò)誤。(以上譯自PHP手冊(cè))
PHP串行化實(shí)例
數(shù)組的串行化和反串行化
OK,讓我們來用實(shí)例學(xué)習(xí)一下,首先,請(qǐng)建立sample1.php文件,我們?cè)谶@個(gè)文件中用如下語句來創(chuàng)建一個(gè)哈希數(shù)組:
代碼:<?php$animal =array('type' => 'human','name' => 'hanguofeng','age'=> '20');?>為了測(cè)試這個(gè)數(shù)組的值,你可以使用print_r()函數(shù)來輸出數(shù)組,輸出的結(jié)果如下:
代碼:Array([type] => human[name] => hanguofeng[age] => 20)那么我們將他來串行化一下,串行化的代碼如下:
代碼:<?php$animal =array('type' => 'human','name' => 'hanguofeng','age'=> '20');$animal_ser=serialize($animal);echo($animal_ser);?>這里我們將數(shù)組$animal串行化,將返回的串行化字符串保存在變量$animal_ser中,并輸出,輸出的結(jié)果是:
代碼:a:3:{s:4:'type';s:5:'human';s:4:'name';s:10:'hanguofeng';s:3:'age';s:2:'20';}我們來簡(jiǎn)單對(duì)這個(gè)字符串進(jìn)行一個(gè)解析:a:3表示這是一個(gè)數(shù)組型的對(duì)象(a),他共有三個(gè)內(nèi)置的對(duì)象(3)大括號(hào)里面的部分是以逗號(hào)分割的對(duì)象表達(dá)式列表,以s:4:'type'為例,他表示一個(gè)字符串(s),長(zhǎng)度為4位(4),值為“type”,即哈希數(shù)組的第一個(gè)元素的鍵。后面的部分以此類推,我們不再贅述,你可以試試自己將各種對(duì)象串行化,看看串行化后的字符串是如何構(gòu)建的。下面來看數(shù)組的反串行化,即將我們上面生成的串行化字符串恢復(fù)為數(shù)組,代碼如下:
代碼:<?php$animal_ser='a:3:{s:4:'type';s:5:'human';s:4:'name';s:10:'hanguofeng';s:3:'age';s:2:'20';}';$animal = unserialize($animal_ser);print_r($animal);?>在第一行中,我們假設(shè)$animal_ser的值為上面獲得的串行化字符串,在第二行將該字符串恢復(fù)為開始的數(shù)組,并賦值給$animal,最后輸出$animal這個(gè)數(shù)組,此時(shí)的輸出和本節(jié)開始時(shí)輸出的原始數(shù)組是一樣的,即:
代碼:Array([type] => human[name] => hanguofeng[age] => 20)這樣我們就完成了數(shù)組的反串行化。
拓展知識(shí)—自定義對(duì)象的串行化和反串行化
對(duì)數(shù)組進(jìn)行串行化是一個(gè)基礎(chǔ)操作,然而在實(shí)際的程序設(shè)計(jì)中,我們可能經(jīng)常對(duì)其他類型的變量進(jìn)行串行化,例如對(duì)某個(gè)自定義對(duì)象進(jìn)行串行化,這里有一個(gè)我們自己編寫的類A(保存在classa.inc中):
代碼:<?phpclass A {var $one = 1;function show_one() { echo $this->one;}}?>我們?cè)谌缦麓a中創(chuàng)建類的實(shí)例并對(duì)該實(shí)例進(jìn)行串行化:
代碼:<?phpinclude('classa.inc');$a=new A;echo(serialize($a));?>此時(shí)輸出的內(nèi)容為:
代碼:O:1:'A':1:{s:3:'one';i:1;}總體來看,這個(gè)串行化字符串輸出了改對(duì)象當(dāng)前的狀態(tài),即i的值為1。下面我們來逐個(gè)分析其中的細(xì)節(jié)。O:1:由于當(dāng)前的變量是一個(gè)自定義對(duì)象,因此該表征字符為“O”,表示Object。后面的'A'標(biāo)識(shí)了該變量是哪個(gè)類的實(shí)例,這里即A類。大括號(hào)內(nèi)即該實(shí)例的各個(gè)屬性的名稱和值。而后我們將其進(jìn)行反串行化:
代碼:<?phpinclude('classa.inc');$s = 'O:1:'A':1:{s:3:'one';i:1;}';$a = unserialize($s);$a->show_one();?>此時(shí)輸出“1”,即調(diào)用了A類的show_one()方法。你可以注意到雖然在實(shí)例的串行化字符串中并沒有包含類的方法,但是我們將其反串行化后,仍然可以調(diào)用類的方法,這個(gè)特性在PHP4及以上版本中被支持(當(dāng)然,你需要包含類的定義文件classa.inc)。
注:你可以參考PHP手冊(cè)中Language Reference->Classes and Objects->Serializing objects - objects in sessions一節(jié)的內(nèi)容。
在JavaScript中串行化為JSON—使用json2.js
JavaScript中沒有直接串行化對(duì)象的內(nèi)置方法,當(dāng)然你可以自己寫一個(gè),不過我還是強(qiáng)烈推薦你在這里偷個(gè)小懶,使用現(xiàn)成的組件,JSON的官方網(wǎng)站www.json.org提供了對(duì)JavaScript對(duì)象實(shí)現(xiàn)JSON串行化的代碼庫(kù)—json2.js,你可以從這里獲得它。
獲得完畢json2.js文件后,你可以打開這個(gè)文件,在文件的前部分包含了相當(dāng)大量的注釋信息,如果你的英文足夠好,那么你可以省略我這一節(jié),參考該文件的注釋就可以了,如果作為程序員,你已經(jīng)看夠了大片的字母,想看看我的漢字+字母,那你可以向下繼續(xù)了。
簡(jiǎn)單的翻譯下這個(gè)注釋:可參考http://www.JSON.org/js.html該文件創(chuàng)建了一個(gè)包含兩個(gè)方法的全局對(duì)象JSON,它的方法分別是:
代碼:JSON.stringify(value, whitelist)value;任意的JavaScript值,一般是一個(gè)對(duì)象或者數(shù)組whitelist;一個(gè)可選的數(shù)組參數(shù),用于判定對(duì)象值如何被串行化這個(gè)方法通過一個(gè)JavaScript值來生成JSON文本。在進(jìn)行串行化時(shí),根據(jù)可選的參數(shù)whitelist,有三種可能:如果某個(gè)對(duì)象有toJSON方法,那么則調(diào)用該方法,toJSON方法的返回值將被串行化。否則,如果可選參數(shù)whitelist是一個(gè)數(shù)組,那么數(shù)組中的元素將被用來選擇對(duì)象進(jìn)行串行化時(shí)的的成員。否則,如果沒有使用whitelist參數(shù),則對(duì)象的所有成員將被串行化。如果值沒有JSON的表現(xiàn)形式,例如undefined或者函數(shù),則其不會(huì)被串行化。在對(duì)象中,這樣的值會(huì)被忽略,而在數(shù)組中將會(huì)被null替換。JSON.stringify(undefined)會(huì)返回undefined。日期將會(huì)被串行化為被引用的ISO日期。例:
代碼:var text = JSON.stringify(['e', {pluribus: 'unum'}]);//text is '['e',{'pluribus':'unum'}]'JSON.parse(text, filter)該方法解析一個(gè)JSON文本,并生成一個(gè)組件或者數(shù)組,其可能拋出一個(gè)SyntaxError異常。可選的filter參數(shù)是一個(gè)可過濾和轉(zhuǎn)換結(jié)果的函數(shù)、它接受每個(gè)鍵和值,它的返回值用來替換源值。如果它返回所接收的值,那么結(jié)果不會(huì)被改變。如果他返回undefined,則該成員會(huì)被刪除。例:
代碼://解析文本,如果某個(gè)鍵包含字符串“date”,則將其值轉(zhuǎn)換為日期myData = JSON.parse(text, function (key, value) {return key.indexOf('date') >= 0 ? new Date(value) : value;});上面的入門教程已經(jīng)使你基本了解了json2.js的使用方法,這里關(guān)于該文件我就不再贅述了,只是有一個(gè)小提示,如果你想簡(jiǎn)單的解析一個(gè)JSON文本,那么可以使用eval()函數(shù),改函數(shù)是JavaScript的內(nèi)置函數(shù),例如解析在JSON.stringify的案例中生成的JSON文本,可以使用:
代碼:var myE = eval('['e',{'pluribus':'unum'}]');來獲得對(duì)象myE。
在JavaScript中串行化為JSON—使用prototype.js
如果你和我一樣,喜歡在自己的項(xiàng)目中使用開源的JavaScript框架,那么你可能可以省去使用json2.js文件了,這里以protype.js為例,該文件可以在http://www.prototypejs.org下載,由于本文不是在講JavaScript框架,這里我假設(shè)你對(duì)prototype.js的使用已經(jīng)有所了解了。prototype.js中提供了對(duì)Object對(duì)象的toJSON方法,你可以使用Object.toJSON()方法來實(shí)現(xiàn)對(duì)對(duì)象的串行化,例如:
代碼:var cat={name:'hellokitty',height:'6 apples'}alert(Object.toJSON(cat));//將彈出對(duì)話框,內(nèi)容為 {'name': 'hellokitty', 'height': '6 apples'}另外,在prototype.js中還有另外的JSON支持,主要是在Ajax對(duì)象中對(duì)Ajax返回請(qǐng)求中JSON內(nèi)容的解析。這里暫時(shí)與我們的內(nèi)容無關(guān),也不再介紹了。
PHP與JSON
在上面我們一起了解了PHP進(jìn)行對(duì)象串行化的方法以及在JavaScript中進(jìn)行將對(duì)象串行化為JSON的方法,你大致會(huì)質(zhì)疑我為什么將二者放在一起,因?yàn)樗麄兊恼Z法實(shí)際是不完全一樣的,然而,在PHP中,可以對(duì)JSON文本進(jìn)行反串行化,也可以將PHP的對(duì)象串行化為JSON而非PHP風(fēng)格的文本。這主要是靠json_decode和json_encode兩個(gè)函數(shù)來完成的,需要特別說明的是,這兩個(gè)函數(shù)在PHP 5 >= 5.2.0中才被支持,如果你要編寫運(yùn)行在PHP4環(huán)境下的程序,那么這兩個(gè)函數(shù)是不可以使用的。
json_decode函數(shù)
語法
mixed json_decode ( string $json [, bool $assoc] )獲取一個(gè)JSON編碼文本,并且將其轉(zhuǎn)換為PHP變量
參數(shù)
json被JSON編碼的文本assoc當(dāng)為TRUE時(shí),返回的值為聯(lián)合數(shù)組
返回值
返回一個(gè)對(duì)象,或者如果可選的assoc參數(shù)為TRUE,則一個(gè)聯(lián)合數(shù)組將會(huì)被返回
json_encode函數(shù)
語法
string json_encode ( mixed $value )該函數(shù)返回一個(gè)值的JSON表達(dá)式
參數(shù)
value要被編碼的值,可以為除resource外的任何類型參數(shù)這個(gè)函數(shù)僅在UTF-8編碼格式時(shí)起作用
返回值
當(dāng)成功時(shí)返回編碼后的JSON文本
json_decode函數(shù)實(shí)例
下面兩個(gè)例子都基于我們的一個(gè)情景假設(shè),即,我們有一個(gè)用戶注冊(cè)的模塊,這個(gè)模塊以“面向?qū)ο蟆钡姆绞焦ぷ鳎趈son_decode函數(shù)實(shí)例中,我們?cè)谇芭_(tái)將用戶的注冊(cè)信息變?yōu)橐粋€(gè)類的屬性,而后傳遞到后臺(tái)的php文件(這里為了簡(jiǎn)便,就不用Ajax了)。在json_encode實(shí)例中,我們?cè)趆tml文件中引用一個(gè)js 文件,地址指向php文件,在php文件中輸出json編碼后的用戶對(duì)象(同樣為了簡(jiǎn)便,我們直接生成一個(gè)對(duì)象而不從數(shù)據(jù)庫(kù)中取信息),并在html中輸出。好了,先來看前臺(tái)的頁面json_encode.htm,這個(gè)頁面模仿了通常的注冊(cè)頁面,在其上面有一個(gè)表單,當(dāng)提交時(shí),觸發(fā) JavaScript函數(shù),生成一個(gè)用戶對(duì)象user,將表單內(nèi)容設(shè)為用戶對(duì)象的屬性,生成JSON文本,以POST方式傳遞到后臺(tái)的 json_encode.php文件。在js_encode.php文件中,將JSON文本用json_decode函數(shù)解析為PHP對(duì)象,并輸出。好了,先來看json_encode.html文件,文件代碼如下:
代碼:<!DOCTYPE html PUBLIC '//W3C//DTD XHTML 1.0 Transitional//EN' 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd'><html xmlns='http://www.w3.org/1999/xhtml'><head><meta http-equiv='Content-Type' content='text/html; charset=utf-8' /><title>json_decode</title><script src='http://www.gepszalag.com/bcjs/json2.js' type='text/javascript'></script><script type='text/javascript'>function JSON_test(o){var user = { name:document.getElementById('txt_name').value, email:document.getElementById('txt_email').value, password:document.getElementById('txt_name').value}var json_string = JSON.stringify(user);
document.getElementById('txt_json').value=json_string;alert('點(diǎn)擊確定后將提交表單');o.submit();}</script></head><body><form name='form1' method='post' action='json_encode.php' onsubmit='JSON_test(this)'> <label for='txt_name'>姓名</label> <p><input type='text' name='txt_name' /> </p> <label for='txt_email'>郵箱</label> <p><input type='text' name='txt_email' /> </p> <p><label for='txt_password'>密碼</label> </p> <p><input type='text' name='txt_password' /> </p> <p> <input type='text' name='txt_json' /><label for='button'></label><input type='submit' name='button' value='JSON' /> </p></form></body></html>當(dāng)提交表單時(shí),將觸發(fā)JavaScript函數(shù)JSON_text(),該函數(shù)首先建立一個(gè)JavaScript對(duì)象user,將其name、email 和password屬性分別設(shè)為對(duì)應(yīng)表單的值,而后使用json2.js文件的JSON.stringify方法將其轉(zhuǎn)換為JSON文本 json_string,最后設(shè)定隱藏域(這里為了使你看的清楚,我把這個(gè)隱藏域以文本框形式顯示了)txt_json的值為json_string,并提交表單。下面到j(luò)son_encode.php文件,如下:
代碼:<?php$json_string = $_POST['txt_json'];if(ini_get('magic_quotes_gpc')=='1'){$json_string=stripslashes($json_string);}$user = json_decode($json_string);echo var_dump($user);?>在這個(gè)文件中,首先得到j(luò)son_encode.html文件中POST表單域txt_json的值,放入變量$json_string中,而后判斷,如果當(dāng)前PHP的設(shè)定為magic_quotes_gpc=On,即傳入的雙引號(hào)等會(huì)被轉(zhuǎn)義,這樣json_decode函數(shù)無法解析,因此我們要將其反轉(zhuǎn)義化。而后,使用json_decode函數(shù)將JSON文本轉(zhuǎn)換為對(duì)象,保存在$user變量中,最終用echo var_dump($user);,將該對(duì)象dump輸出出來,最終結(jié)果是:
代碼:object(stdClass)#1 (3) { ['name']=> string(10) 'hanguofeng' ['email']=> string(18) 'example@domain.com' ['password']=> string(10) 'hanguofeng'}json_encode函數(shù)實(shí)例
在這個(gè)例子中,仍然是由兩部分構(gòu)成的,即json_enode.html和json_encode.php。在json_decode.html文件中,基本與 json_decode.html文件的表單類似,但是不同的是,這次我們要從json_encode.php文件中獲得相應(yīng)用戶的JSON文本,先來看這個(gè)PHP文件吧:
代碼:<?phpClass user{public $name='';public $email='';public $password='';};$myUser = new user;$myUser->name='hanguofeng';$myUser->email='example@domain.com';$myUser->password='hanguofeng';$json_string = json_encode($myUser);?>var user = <?php echo($json_string)?>;這個(gè)文件首先建立類user,而后獲得一個(gè)user類的實(shí)例myUser,并設(shè)定其用戶名、郵箱和密碼,接下來使用json_encode函數(shù)將其轉(zhuǎn)換為 JSON文本,保存在變量$json_string中,最后輸出一段JavaScript代碼,以在JavaScript中建立全局變量user。接下,我們需要在json_encode.html文件中引入json_encode.php文件,并得到user對(duì)象的各個(gè)屬性,如下:
代碼:<!DOCTYPE html PUBLIC '//W3C//DTD XHTML 1.0 Transitional//EN' 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd'><html xmlns='http://www.w3.org/1999/xhtml'><head><meta http-equiv='Content-Type' content='text/html; charset=utf-8' /><title>json_encode</title><script src='http://www.gepszalag.com/bcjs/json_encode.php' type='text/javascript'></script></head><body><form name='form1' method='post'> <label for='txt_name'>姓名</label> <p><input type='text' name='txt_name' /> </p> <label for='txt_email'>郵箱</label> <p><input type='text' name='txt_email' /> </p> <p><label for='txt_password'>密碼</label> </p> <p><input type='text' name='txt_password' /> </p></form><script type='text/javascript' >document.getElementById('txt_name').value=user.name;document.getElementById('txt_email').value=user.email;document.getElementById('txt_password').value=user.password;</script></body></html>在這個(gè)文件中,你需要注意兩點(diǎn),第一是,我們以這樣的代碼引入json_encode.php文件為JavaScript文件:
代碼:<script src='http://www.gepszalag.com/bcjs/json_encode.php' type='text/javascript'></script>第二點(diǎn)則是:我們?cè)谖谋究虼a后面加入JavaScript的代碼,對(duì)文本框的value屬性進(jìn)行操作,分別設(shè)定其值為user對(duì)象的相應(yīng)值。
