- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章PHP常用操作类之通信数据封装类的实现由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
前言 。
本文主要给大家介绍了关于php常用操作类之通信数据封装类实现的相关内容,分享出来供大家参考学习,下面话不多说,来一起看看详细的介绍:
必要性 。
不管在b/s架构中,还是c/s架构中,两端的数据通信(注:这里的通信是指的网络请求和回复操作)都无可避免,因为没有数据便没有内容,没有内容,又有什么意义 :) 。
一般来说c/s架构通信执行流程如下:
而b/s架构通信执行流程像这样:
选择 。
既然数据通信,不可避免,那应该选择哪种通信方式比较好呢?目前来看服务器与客户端进行数据传输与交互的方式主要有url、xml、json三种方式.
url方式是最常用也是最直接的,通常用于get方法,其实我认为post中的form表单实质上也是url方式,但这种传输方式数据有限,也不规范,只适合一些简单场景。xml和json实质上都是对数据的描述,目的是对复杂数据进行分割、包装、规范化等一系列处理,方便数据传输和解析,相对来说json比xml更轻巧但却更灵活强大,举个例子:用以上两种方式表示我的个人信息如下:
1
2
3
4
5
6
7
8
9
|
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 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
|
<?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 。
原文链接:https://segmentfault.com/a/1190000010197447 。
最后此篇关于PHP常用操作类之通信数据封装类的实现的文章就讲到这里了,如果你想了解更多关于PHP常用操作类之通信数据封装类的实现的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我需要使用封装打印3个变量,并且无法修改主类。 主类声明变量[汽缸、制造商、所有者],并希望使用如下参数创建和打印一个对象: System.out.println (new Vehicle (cyli
我正在研究“Beginning Ruby”这本书,在我进行封装之前一切都进行得很顺利。我明白这段代码在做什么,我只是不知道为什么要用这些方法设置它。 对于那些感兴趣的人 this is the lin
所以我一直在研究面向对象的完整开发 JavaScript 实践,并对以下示例感到好奇。 据我了解,(这对我来说很有意义)以下“ secret ”字段是“私有(private)”的: var MyObj
在面向对象程式设计方法中,封装(英语:Encapsulation)是指,一种将抽象性函式接口的实作细节部份包装、隐藏起来的方法。 封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代
封装 被定义为 把一个或多个项目封闭在一个物理的或者逻辑的包中 。在面向对象程序设计方法论中,封装是为了防止对实现细节的访问。 抽象和封装是面向对象程序设计的相关特性。抽象允许相关信息可
今天我读了一本书,作者写道,在一个设计良好的类中,访问属性的唯一方法是通过其中一个类方法。这是一个被广泛接受的想法吗?为什么封装属性如此重要?不做会有什么后果?我早些时候在某处读到这可以提高安全性或类
今天我接受了软件工程职位的面试。我已经从 stackoverflow 中阅读了很多关于面试的内容。他们向我询问了与 OOP 相关的正常情况。但他们也问我这些: 没有继承就可以封装吗? 没有继承就可以抽
我正在制作一个简单的网站,并编写了gradle构建脚本,该脚本将执行诸如lint并最小化css / html / js之类的事情。 在这一阶段,我刚刚完成了正在运行的CSS,但是只是初始的非结构化格式
下面的幻灯片是指 C++ 语言,它说 "encapsulation is about ensuring the user uses our ADT in a safe way" 但是,如果他可以访问我
尝试设置一个 Person 类 我在尝试将信息封装在类中以使其不会被意外更改时遇到了问题。除了当我尝试使用 setter/getters 进行封装时,该类工作得非常好。我认为问题是这些方法最终会互相循
面向对象的概念:封装、数据抽象和数据隐藏是3个不同的概念,但彼此之间非常相关。所以我很难通过阅读互联网上的信息来完全理解这些概念。一个地方可用的信息与互联网上另一个地方的信息相矛盾。有人可以指导我阅读
我被封装困住了。在我看来,好像我已经按照规则做了一切,但仍然不起作用。虽然我知道我错过了一些东西。我正在使用 Eclipse。 我想要通过创建一副标准 52 张卡片来进行一些练习,并尝试我学到的新东西
在java中,要获取映射中的所有键,我们可以使用方法keySet。但我想知道为什么方法名称不只是 keys ?名称 Set 是否会泄露有关实现的详细信息? 据我了解,Java 是静态类型语言,名称中包
我正在尝试找出如何防止应用程序中的页面变量被全局定义。我想出了一些方法,但我想知道是否有人们使用的通用标准方法。 我使用这种方法得到了我的插件设计模式:http://www.virgentech.co
我有一个 tcp 连接,我想在服务器类的 HandleConnectionAsync 方法中保持打开状态。它将从客户端接收持续更新。 private async void HandleConnecti
这是我类(class)的一个小样本: #include #include using std::string; using std::vector; struct Book { string
我想要类似下面的代码: class Foo{ public: void update() { for( auto dataModifier : _dataModifierLis
这已经困扰我一段时间了,所以我问了一个同事他是否能理解它,现在我来了;) 为什么可以在依赖属性的 PropertyChangedCallback 中访问持有类的私有(private)成员? 让我通过这
我知道封装意味着一个对象不应该直接访问不同对象的成员……但我猜它与公共(public)领域有关?我假设公共(public)方法不会破坏封装..?我只是在这里不清楚,很高兴得到任何解释。 最佳答案
我就废话不多说了,大家还是直接看代码吧~ ? 1
我是一名优秀的程序员,十分优秀!