PHP常用操作类之通信数据封装类的实现


Posted in PHP onJuly 16, 2017

前言

本文主要给大家介绍了关于PHP常用操作类之通信数据封装类实现的相关内容,分享出来供大家参考学习,下面话不多说,来一起看看详细的介绍:

必要性

不管在B/S架构中,还是C/S架构中,两端的数据通信(注:这里的通信是指的网络请求和回复操作)都无可避免,因为没有数据便没有内容,没有内容,又有什么意义 :)

一般来说C/S架构通信执行流程如下:

PHP常用操作类之通信数据封装类的实现

而B/S架构通信执行流程像这样:

PHP常用操作类之通信数据封装类的实现

选择

既然数据通信,不可避免,那应该选择哪种通信方式比较好呢?目前来看服务器与客户端进行数据传输与交互的方式主要有URL、XML、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);

总结

以上就是这篇文章的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

参考链接

1、浅谈PHP与手机APP开发即API接口开发

2、C/S B/S 及WEB工作原理

3、对比分析json及XML

PHP 相关文章推荐
PHP的单引号和双引号 字符串效率
May 27 PHP
使用zend studio for eclipse不能激活代码提示功能的解决办法
Oct 11 PHP
用js进行url编码后用php反解以及用php实现js的escape功能函数总结
Feb 08 PHP
php Smarty初体验二 获取配置信息
Aug 08 PHP
PHP迭代器的内部执行过程详解
Nov 12 PHP
实例讲解PHP面向对象之多态
Aug 20 PHP
UPUPW 更新 64 位 Apache 系列 PHP 7.0 正式版
Dec 08 PHP
Laravel路由设定和子路由设定实例分析
Mar 30 PHP
jquery不支持toggle()高(新)版本的问题解决
Sep 24 PHP
PHP使用strrev翻转中文乱码问题的解决方法
Jan 13 PHP
PHP递归实现汉诺塔问题的方法示例
Nov 25 PHP
php中array_fill函数的实例用法
Mar 02 PHP
Laravel网站打开速度优化的方法汇总
Jul 16 #PHP
PHP实现创建微信自定义菜单的方法示例
Jul 14 #PHP
PHP微信公众号开发之微信红包实现方法分析
Jul 14 #PHP
PHP机器学习库php-ml的简单测试和使用方法
Jul 14 #PHP
thinkphp3.2嵌入百度编辑器ueditor的实例代码
Jul 13 #PHP
PHP微信PC二维码登陆的实现思路
Jul 13 #PHP
PHP基于socket实现客户端和服务端通讯功能
Jul 13 #PHP
You might like
php处理斐波那契数列非递归方法
2012/02/04 PHP
浅谈PHP无限极分类原理
2019/03/14 PHP
PHP 出现 http500 错误的解决方法
2021/03/09 PHP
在多个页面使用同一个HTML片段的代码
2011/03/04 Javascript
Ext.get() 和 Ext.query()组合使用实现最灵活的取元素方式
2011/09/26 Javascript
jQuery插件原来如此简单 jQuery插件的机制及实战
2012/02/07 Javascript
利用JS判断用户是否上网(连接网络)
2013/12/23 Javascript
从QQ网站中提取的纯JS省市区三级联动菜单
2013/12/25 Javascript
JavaScript返回网页中超链接数量的方法
2015/04/03 Javascript
PHP+MySQL+jQuery随意拖动层并即时保存拖动位置实例讲解
2015/10/09 Javascript
js实现页面跳转的五种方法推荐
2016/03/10 Javascript
jQuery easyui刷新当前tabs的方法
2016/09/23 Javascript
jQuery实现Select下拉列表进行状态选择功能
2017/03/30 jQuery
Vue.js实现实例搜索应用功能详细代码
2017/08/24 Javascript
EL表达式截取字符串的函数说明
2017/09/22 Javascript
微信小程序实现简单表格
2019/02/14 Javascript
layui监听单元格编辑前后交互的例子
2019/09/16 Javascript
用实例说明python的*args和**kwargs用法
2013/11/01 Python
python实现跨文件全局变量的方法
2014/07/07 Python
python下10个简单实例代码
2017/11/15 Python
Python语言实现百度语音识别API的使用实例
2017/12/13 Python
Python文本特征抽取与向量化算法学习
2017/12/22 Python
python正则实现提取电话功能
2018/02/24 Python
win10下tensorflow和matplotlib安装教程
2018/09/19 Python
对Python Pexpect 模块的使用说明详解
2019/02/14 Python
python中嵌套函数的实操步骤
2019/02/27 Python
python基于itchat模块实现微信防撤回
2019/04/29 Python
用Python调用win命令行提高工作效率的实例
2019/08/14 Python
pytorch 中的重要模块化接口nn.Module的使用
2020/04/02 Python
python爬虫请求头设置代码
2020/07/28 Python
详解CSS3的图层阴影和文字阴影效果使用
2016/06/09 HTML / CSS
深入理解css中vertical-align属性
2017/04/18 HTML / CSS
后进生转化工作制度
2014/01/17 职场文书
校园安全标语
2014/06/07 职场文书
陶瓷类经典广告语集锦
2019/10/25 职场文书
2022微信温控新功能上线
2022/05/09 数码科技