PHP經常使用操做類實現——通訊數據封裝類

謝謝你們的收藏與贊,這是對我最大的鼓勵。php

必要性

無論在B/S架構中,仍是C/S架構中,兩端的數據通訊(注:這裏的通訊是指的網絡請求和回覆操做)都無可避免,由於沒有數據便沒有內容,沒有內容,又有什麼意義 :)
通常來講C/S架構通訊執行流程以下:html

823310-20160506195930997-2001021521.jpg

而B/S架構通訊執行流程像這樣:數據庫

823310-20160506195943935-1237461310.jpg

選擇

既然數據通訊,不可避免,那應該選擇哪一種通訊方式比較好呢?目前來看服務器與客戶端進行數據傳輸與交互的方式主要有URL、XML、JSON三種方式。json

URL方式是最經常使用也是最直接的,一般用於GET方法,其實我認爲POST中的Form表單實質上也是URL方式,但這種傳輸方式數據有限,也不規範,只適合一些簡單場景。
XML和JSON實質上都是對數據的描述,目的是對複雜數據進行分割、包裝、規範化等一系列處理,方便數據傳輸和解析,相對來講JSON比XML更輕巧但卻更靈活強大,舉個例子:用以上兩種方式表示個人我的信息以下:數組

JSON:
    {"name":"entner","age":21,"gender":"男"}
    
    XML:
    <ROOT>
        <name>entner</name>
        <age>21</age>
        <gender>男</gender>
    </ROOT>

有興趣的讀者,能夠參看後面的參考連接,寫的很是詳細。服務器

如何封裝?

上面講了,XML和JSON是目前主流的通訊數據格式,下面就來說講如何封裝,方便運用。網絡

假設咱們在後臺操做數據庫服務器獲得數組數據,對於數組轉Json只須要json_encode函數就夠了,它會自動遞歸檢測,對於數組轉XML,就須要嚴格按照格式來,具體看代碼和註釋吧。架構

Source Code

<?php
/**
 * TODO:Json格式數據通訊
 * Author:entner
 * time:   2017-5-8
 * version:1.0
 * ready:
        狀態碼  :int    $code
        提示消息:string $message
        消息內容:array $data
        數組包裝:array $result
        

   function: 
       show         封裝多種通訊數據格式
       jsonEncode   封裝Json格式通訊數據
       xmlToJson    封裝xml格式通訊數據
       xmlEncode     遞歸調用xmlToJson

 */
Class Json{

    const  JSON = "json";

/**
     *按綜合方式輸出通訊數據
     *@param inter code 狀態碼
     *@param char  message 消息提示
     *@param array data 通訊數據
     *@param string type 數據類型
     *return string
    */    

    public function show($code,$message,$data=array(),$type = self::JSON){
        /*    檢查狀態碼是否合法    */
        if(!is_numeric($code)){
            exit();
        }

        $result = array(
            'code'=>$code,
            'message'=>$message,
            'data'=>$data
            );

        /* 由客戶端傳遞參數決定封裝數據的格式,默認Json格式 */
        $type = isset($_GET['format'])? $_GET['format']:self::JSON;

        if($type == 'xml'){
            $this->xmlEnCode($code,$message,$data);
            exit;    //一次不容許併發多種格式,因此不必執行下面的判斷
        }else if($type == 'json'){
            $this->jsonEncode($code,$message,$data);
            exit ;
        }else if($type == 'array'){
            var_dump($result);
            exit;
        }else{
            // 客戶端傳來的數據格式爲 http/ftp/
        }

    }


/**
     *輸出Json格式通訊數據
     *@param inter code 狀態碼
     *@param char  message 消息提示
     *@param array data 通訊數據
     *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會自動遞歸轉換數組變量
        return true;
    }

    /**
     *輸出XML格式通訊數據
     *@param inter code 狀態碼
     *@param char  message 消息提示
     *@param array data 通訊數據
     *return string
    */    
    public function xmlEnCode($code,$message,$data=array()){
        if(!is_numeric($code)){
            exit();
        }
        $result = array(
            'code'=>$code,
            'message'=>$message,
            'data'=>$data
            );

        /*    拼接xml格式數據    */
        
        
        /*    這裏必定要注意聲明頭部信息和XML聲明    */
        header("Content-type:text/xml");
        $xml  = "<?xml version = '1.0' encoding = 'UTF-8'?>\n";
        $xml .= "<root>\n";          /*     XML標籤其實也是字符串,因此要用 . 鏈接運算符     */
        $xml .= self::xmlToJson($result); /* 調用xmlToJson函數解析數組轉換爲節點 */        
        $xml .= "</root>";
        echo $xml;        
    }

    /**
     *遞歸拼接XML數據
     *@param inter code 狀態碼
     *@param char  message 消息提示
     *@param array data 通訊數據
     *return string
    */    
    public static function xmlToJson($data){
        $xml = $attr = "";
        foreach($data as $k => $v){

            /*XML不容許出現數字標籤,因此要麼獎數字轉化爲字母,要麼混合拼接,這裏採用很合拼接的方式 */
            if(is_numeric($k)){
                $attr = " id = '{$k}' ";
                $k = "item";
                $xml .="<{$k}{$attr}>\n";
                /*    由於數組內部可能還存在數組,因此須要自行遞歸檢查一遍,注意,在每次遞歸的時候,都要鏈接在$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);

參考連接

淺談PHP與手機APP開發即API接口開發
C/S B/S 及WEB工做原理
對比分析json及XML併發

結語

這幾天在搬宿舍,剛忙完,第一時間就來了,哈哈。
仍是那句老話,歡迎各位留言和評論。函數

相關文章
相關標籤/搜索