PHP常用操作類之通信數(shù)據(jù)封裝類的實(shí)現(xiàn)
前言
本文主要給大家介紹了關(guān)于PHP常用操作類之通信數(shù)據(jù)封裝類實(shí)現(xiàn)的相關(guān)內(nèi)容,分享出來(lái)供大家參考學(xué)習(xí),下面話不多說(shuō),來(lái)一起看看詳細(xì)的介紹:
必要性
不管在B/S架構(gòu)中,還是C/S架構(gòu)中,兩端的數(shù)據(jù)通信(注:這里的通信是指的網(wǎng)絡(luò)請(qǐng)求和回復(fù)操作)都無(wú)可避免,因?yàn)闆](méi)有數(shù)據(jù)便沒(méi)有內(nèi)容,沒(méi)有內(nèi)容,又有什么意義 :)
一般來(lái)說(shuō)C/S架構(gòu)通信執(zhí)行流程如下:

而B(niǎo)/S架構(gòu)通信執(zhí)行流程像這樣:

選擇
既然數(shù)據(jù)通信,不可避免,那應(yīng)該選擇哪種通信方式比較好呢?目前來(lái)看服務(wù)器與客戶端進(jìn)行數(shù)據(jù)傳輸與交互的方式主要有URL、XML、JSON三種方式。
URL方式是最常用也是最直接的,通常用于GET方法,其實(shí)我認(rèn)為POST中的Form表單實(shí)質(zhì)上也是URL方式,但這種傳輸方式數(shù)據(jù)有限,也不規(guī)范,只適合一些簡(jiǎn)單場(chǎng)景。XML和JSON實(shí)質(zhì)上都是對(duì)數(shù)據(jù)的描述,目的是對(duì)復(fù)雜數(shù)據(jù)進(jìn)行分割、包裝、規(guī)范化等一系列處理,方便數(shù)據(jù)傳輸和解析,相對(duì)來(lái)說(shuō)JSON比XML更輕巧但卻更靈活強(qiáng)大,舉個(gè)例子:用以上兩種方式表示我的個(gè)人信息如下:
JSON:
{"name":"entner","age":21,"gender":"男"}
XML:
<ROOT>
<name>entner</name>
<age>21</age>
<gender>男</gender>
</ROOT>
有興趣的讀者,可以參看后面的參考鏈接,寫(xiě)的非常詳細(xì)。
如何封裝?
上面講了,XML和JSON是目前主流的通信數(shù)據(jù)格式,下面就來(lái)講講如何封裝,方便運(yùn)用。
假設(shè)我們?cè)诤笈_(tái)操作數(shù)據(jù)庫(kù)服務(wù)器得到數(shù)組數(shù)據(jù),對(duì)于數(shù)組轉(zhuǎn)Json只需要json_encode函數(shù)就夠了,它會(huì)自動(dòng)遞歸檢測(cè),對(duì)于數(shù)組轉(zhuǎn)XML,就需要嚴(yán)格按照格式來(lái),具體看代碼和注釋吧。
Source Code
<?php
/**
* TODO:Json格式數(shù)據(jù)通信
* Author:entner
* time: 2017-5-8
* version:1.0
* ready:
狀態(tài)碼 :int $code
提示消息:string $message
消息內(nèi)容:array $data
數(shù)組包裝:array $result
function:
show 封裝多種通信數(shù)據(jù)格式
jsonEncode 封裝Json格式通信數(shù)據(jù)
xmlToJson 封裝xml格式通信數(shù)據(jù)
xmlEncode 遞歸調(diào)用xmlToJson
*/
Class Json{
const JSON = "json";
/**
*按綜合方式輸出通信數(shù)據(jù)
*@param inter code 狀態(tài)碼
*@param char message 消息提示
*@param array data 通信數(shù)據(jù)
*@param string type 數(shù)據(jù)類型
*return string
*/
public function show($code,$message,$data=array(),$type = self::JSON){
/* 檢查狀態(tài)碼是否合法 */
if(!is_numeric($code)){
exit();
}
$result = array(
'code'=>$code,
'message'=>$message,
'data'=>$data
);
/* 由客戶端傳遞參數(shù)決定封裝數(shù)據(jù)的格式,默認(rèn)Json格式 */
$type = isset($_GET['format'])? $_GET['format']:self::JSON;
if($type == 'xml'){
$this->xmlEnCode($code,$message,$data);
exit; //一次不允許并發(fā)多種格式,所以沒(méi)必要執(zhí)行下面的判斷
}else if($type == 'json'){
$this->jsonEncode($code,$message,$data);
exit ;
}else if($type == 'array'){
var_dump($result);
exit;
}else{
// 客戶端傳來(lái)的數(shù)據(jù)格式為 http/ftp/
}
}
/**
*輸出Json格式通信數(shù)據(jù)
*@param inter code 狀態(tài)碼
*@param char message 消息提示
*@param array data 通信數(shù)據(jù)
*return string
*/
public function jsonEnCode($code,$message,$data=array()){
if(!is_numeric($code)){
exit();
}
$result = array(
'code'=>$code,
'message'=>$message,
'data'=>$data
);
echo json_encode($result); //json_encode會(huì)自動(dòng)遞歸轉(zhuǎn)換數(shù)組變量
return true;
}
/**
*輸出XML格式通信數(shù)據(jù)
*@param inter code 狀態(tài)碼
*@param char message 消息提示
*@param array data 通信數(shù)據(jù)
*return string
*/
public function xmlEnCode($code,$message,$data=array()){
if(!is_numeric($code)){
exit();
}
$result = array(
'code'=>$code,
'message'=>$message,
'data'=>$data
);
/* 拼接xml格式數(shù)據(jù) */
/* 這里一定要注意聲明頭部信息和XML聲明 */
header("Content-type:text/xml");
$xml = "<?xml version = '1.0' encoding = 'UTF-8'?>\n";
$xml .= "<root>\n"; /* XML標(biāo)簽其實(shí)也是字符串,所以要用 . 連接運(yùn)算符 */
$xml .= self::xmlToJson($result); /* 調(diào)用xmlToJson函數(shù)解析數(shù)組轉(zhuǎn)換為節(jié)點(diǎn) */
$xml .= "</root>";
echo $xml;
}
/**
*遞歸拼接X(jué)ML數(shù)據(jù)
*@param inter code 狀態(tài)碼
*@param char message 消息提示
*@param array data 通信數(shù)據(jù)
*return string
*/
public static function xmlToJson($data){
$xml = $attr = "";
foreach($data as $k => $v){
/*XML不允許出現(xiàn)數(shù)字標(biāo)簽,所以要么獎(jiǎng)數(shù)字轉(zhuǎn)化為字母,要么混合拼接,這里采用很合拼接的方式 */
if(is_numeric($k)){
$attr = " id = '{$k}' ";
$k = "item";
$xml .="<{$k}{$attr}>\n";
/* 因?yàn)閿?shù)組內(nèi)部可能還存在數(shù)組,所以需要自行遞歸檢查一遍,注意,在每次遞歸的時(shí)候,都要連接在$xml尾部,并換行 */
$xml .=is_array($v)?self::xmlToJson($v):$v;
$xml .="</{$k}>\n";
}else{
$xml .="<{$k}>\n";
$xml .=is_array($v)?self::xmlToJson($v):$v;
$xml .="</{$k}>\n";
}
}
return $xml;
}
}
$data = array(
'name'=>'entner',
'type'=>array(
0=>'a',
1=>'b'
)
);
$try = new Json();
$try->xmlEnCode(200,'success',$data);
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
參考鏈接
1、淺談PHP與手機(jī)APP開(kāi)發(fā)即API接口開(kāi)發(fā)
相關(guān)文章
PHP curl 或 file_get_contents 獲取需要授權(quán)頁(yè)面的方法
本篇文章主要介紹了PHP curl 或 file_get_contents獲取需要授權(quán)頁(yè)面的方法,具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧2017-05-05
php實(shí)現(xiàn)點(diǎn)擊可刷新驗(yàn)證碼
這篇文章主要介紹了php如何實(shí)現(xiàn)點(diǎn)擊即可刷新驗(yàn)證碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2015-11-11
php array_unique之后json_encode需要注意
php array_unique之后json_encode需要注意的地方,需要的朋友可以參考下。2011-01-01
php實(shí)現(xiàn)的簡(jiǎn)單多進(jìn)程服務(wù)器類完整示例
這篇文章主要介紹了php實(shí)現(xiàn)的簡(jiǎn)單多進(jìn)程服務(wù)器類,結(jié)合完整實(shí)例形式分析了PHP多進(jìn)程服務(wù)器數(shù)據(jù)傳輸、響應(yīng)、處理等相關(guān)操作技巧,需要的朋友可以參考下2020-02-02
php下實(shí)現(xiàn)一個(gè)阿拉伯?dāng)?shù)字轉(zhuǎn)中文數(shù)字的函數(shù)
最近因需要,寫(xiě)了個(gè)“阿拉伯?dāng)?shù)字轉(zhuǎn)中文數(shù)字的函數(shù)”。搜索了精華區(qū)只見(jiàn)到一個(gè)類似的。 感覺(jué)到我的算法不錯(cuò),所以貼出來(lái)共享一下2008-07-07
php字符串過(guò)濾strip_tags()函數(shù)用法實(shí)例分析
這篇文章主要介紹了php字符串過(guò)濾strip_tags()函數(shù)用法,結(jié)合實(shí)例形式分析了php字符串過(guò)濾函數(shù)strip_tags()功能、參數(shù)及相關(guān)使用技巧,需要的朋友可以參考下2019-06-06

