《PHP精粹:编写高效PHP代码》——3.3节数据格式

3.3 数据格式
在许多方面,Web服务仅仅只是一个网页,它提供机器可读的内容,而不是人类可读的内容。我们与其在一个浏览器的HTML网页标记标签,不如返回内容到JSON或XML中(我们马上将论及上述内容)。
健壮性Web服务的强大特征之一便是它的设计可使其以不同的格式返回信息。因此,如果一个服务消费者更喜欢另一种数据格式,它可以轻易请求到最好的格式。这表明,当我们创建的服务公开后,解释请求和构成响应的方式是独立于代码中其他部分的。
接下来的两节将详细讲解JSON和XML,并举例说明如何以这种方式格式化数据,以及我们如何读写数据。

3.3.1 使用JSON
JSON代表JavaScript Object Notation。它最初是表示JavaScript对象的一种方式,但是很多现代编程语言都具有使用这种格式的内置功能。这是基于文本、用来表示数组或对象的一种方式,类似于PHP的序列化。
JSON是一种轻量级的格式;数据包又小又简单,这使得我们可以快速轻松地处理它。由于我们将JSON设计用于JavaScript,因此它是JavaScript使用API的最佳选择;在本章后面内容中,你会看到在网页中使用Ajax请求包含Web服务内容的示例。JSON对于移动设备应用程序而言也是一种不错的选择;它的小体积和简单格式意味着它可快速传送数据,而且在客户端上我们只需简单处理就可以对它进行解码。
在PHP中,我们用json_encode()函数编写JSON,用json_decode()将它读取回来。这听起来很简单吗?可能因为JSON就是这么简单,下面是一个对数组编码的示例。

在这个示例中,我们仅通过json_encode()函数将字符串输出,再将它转换回来进入一个PHP数组。既然我们想要的是一个关联数组而不是一个对象,因此传入true作为json_encode()函数的第二个参数。若没有这些,我们会得到一个包含3个stdClass对象的数组,其中每个对象的属性名均为title和time。
从这些示例我们清楚地知道,在PHP中JSON的使用非常简单,它本身对于各种类型的Web服务而言是一个非常受欢迎的选择。

3.3.2 使用XML
看过JSON的示例之后,让我们来看看另一种常用的数据格式:XML。XML表示可扩展标记语言(extensible Markup Language);在许多平台上它是表示机器可读数据的标准方式。
XML是比JSON更详细的一种格式。它包含更多数据类型的信息,不同的系统将使用不同的标记和属性详尽地描述信息。人们读到XML时会觉得很棘手,但它作为一种规范的格式在机器上使用是非常理想的。因此,当我们集成两个系统并交换无人管理的重要数据时,XML是一种很好的选择。
在PHP中,我们有很多方式使用XML,其中最重要的是DOM扩展或SimpleXML扩展。这两种扩展在功能上有很多重叠部分;然而,简而言之,DOM的可描述性更为强大而且复杂,而SimpleXML则非常简单!你可以调用单一的函数在两种格式之间切换使用,因此,当开始你使用一种方式,而后为了一个特殊操作而使用另一种方式是没有意义的。由于我们使用的是基本示例,所以这里将展示使用SimpleXML扩展的代码。
让我们像前面JSON一样开始下面的示例。

让我们从文件顶部开始讲解这个示例。首先,我们创建了一个SimpleXMLElement,它将一个标准格式的XML字符串传递给构造函数。如果我们想读取并使用现有的XML,这是非常重要的(当我们用XML数据解析传入请求,这确实非常便利),但是我们创建空元素时会感到有点古怪。
接着我们开始添加元素。在XML中,我们不能枚举条目,所有的东西都要放在一个已命名的标签内,因此每个音乐会的条目都要放在一个命名为concert的标签内。当我们继续添加子元素时,可以为这些子元素指定一个变量,这允许我们继续对这个变量进行操作。既然这样,我们要为concert标签添加更多的子元素,并将这些子元素存放在$concert1变量中,然后添加title和time标签作为子元素。
接下来我们可以对其他的音乐会重复以上操作(在一个实际的应用程序中,你可以使用循环结构从其他地方导入数据),然后使用SimpleXMLElement::asXML()方法输出XML。这种方法确实输出了对象代表的XML。
当我们读取这个XML时,你会觉得相当琐碎:

首先,我们载入XML到SimpleXML对象,这样就可以轻松地使用它。然后我们使用循环遍历里面的条目;我们可以使用foreach循环轻松迅速地遍历数据集。
如果我们在循环里通过var_dump()检查每一个$concert值,我们会看到它们实际上是SimpleXMLElement对象,而不是简单的数组。当我们输出$concert->title时,SimpleXML知道如何将$concert->title表示为一个字符串,因此,正如我们预期的那样,$concert->title输出对象的值。不管怎样,处理日期格式的数据很棘手!date()函数预计第二个参数是一个长数字,当你传入一个SimpleXMLElement来替代这个参数时会出现错误。你可能在以上示例中注意到这一点,我们将$concert对象的time属性进行类型转换为一个字符串。之所以这样做,是因为SimpleXMLElement知道如何将自己转换为字符串,而且如果我们提供一个字符串,PHP会用date()将其转换为正确的数据类型。
SimpleXMLElement对象类型
当你使用SimpleXML时,通常会发现这里有你预期值的对象。我们利用这个已使用的方法,在需要的地方将这些值进行类型转换,这是一个轻松使用那些值的好方法。

在这个示例结尾的地方还有一个“featured concert”,它表明SimpleXML对象是如何轻松穿过对象的结构找到我们想要的值。在我们使用XML数据和Web服务时,在SimpleXML的特性和简单迭代能力之中,你会看到SimpleXML是工具盒中极好的一个工具。

时间: 2024-12-06 11:49:45

《PHP精粹:编写高效PHP代码》——3.3节数据格式的相关文章

《PHP精粹:编写高效PHP代码》——2.8节数据库—排序

2.8 数据库-排序 在本章,我们全面讲述了与PHP开发者息息相关的数据库主题.了解了PDO扩展并利用它在你的应用程序中建立稳定高效的代码. 除PHP外,我们还研究了一连串的数据库技术,这些技术以不同的方式在表中建立SQL查询.我们还使用索引,设计了经受住时间和可扩展性考验的数据库架构.

《PHP精粹:编写高效PHP代码》——1.8节更多神奇的方法

1.8 更多神奇的方法 本章已介绍了一些神奇方法.在表1.1中快速回顾一下这些方法. 当在一个类中定义这些函数时,可以定义当这些事件发生时会引发什么.没有这些函数的话,类将显现为默认行为,而这些常常都是需要的.PHP另外还有一些神奇方法,在本节中我们将看到一些使用最频繁的方法. 1.8.1 使用__call()和__callStatic()方法 在关于访问修饰符的内容里,我们看到,对于__get()和__set()方法而言,__call()方法是一个天生的搭档.使用__get()和__set()

《PHP精粹:编写高效PHP代码》——3.4节HTTP:超文本传输协议

3.4 HTTP:超文本传输协议HTTP(HyperText Transfer Protocol)是通过导线来传送Web请求和响应的数据传输格式.它包含了很多请求和响应的元数据,除了这些请求或响应的实体之外,我们也可以利用它来使用Web服务.我们也将看到其他的协议,例如XML-RPC和SOAP,它们也都是建立在HTTP基础上的.当我们在本章快结尾构建RESTful服务时,便可以广泛使用HTTP的功能了.当我们开发一个简单的Web应用程序时,可能不会那么重视HTTP.但是如果你想了解缓存.不同文件

学习PHP精粹,编写高效PHP代码之质量保证

一.使用静态分析工具测量质量   我们用静态分析测量代码而不运行它.实际上,我们将这些工具用于评估代码.读取文件.衡量它所写的要素.使用这些工具,可以帮助我们对代码库有一个完整的层次化的认识,甚至在代码库变得更大.更复杂的时候也能掌握.   静态分析工具是项目过程中的一个关键组成部分,但是,只有定期使用它们,并以理想的方式进行每一次提交,静态分析工具才真正显示出价值.这些工具涵盖了代码的所有方面,从计数类和计算行数,到识别哪里有提示使用复制和粘贴的类似代码段.然后我们来看看静态分析工具在代码质量

《PHP精粹:编写高效PHP代码》——1.7节异常

1.7 异常 异常(exception)是一个处理错误的面向对象方法.一些PHP扩展像往常一样仍会报错:很多最新的扩展(例如PDO)将代替抛出异常.异常也是对象,而且Exception是PHP的一个内置类.一个Exception对象将包含发生错误的位置(文件名或代码行).一条错误消息和(可选)一个错误代码等信息. 1.7.1 处理异常 首先我们看看如何处理可能会抛出异常的函数.我们会使用一个PDO示例,因为PDO扩展抛出异常.在这里代码会试图创建一个数据库连接,但是会失败,因为nonsense主

《PHP精粹:编写高效PHP代码》——2.4节PHP数据库对象

2.4 PHP数据库对象 如果之前你使用过PHP和MySQL,你可能用过mysql或mysqli类库连接到数据库,如使用mysql_connect()函数.多年来,这是连接到MySQL数据库的标准方式,并且对于其他数据库平台也使用同样的方式. 这些类库可以直接使用,并形成了无数PHP应用程序类库和框架的基础.这种方式的缺点是每个扩展都与其他稍有不同,因此使得代码在数据库平台之间轻松转移变得复杂.虽然这些数据库特定类库依然活跃并且运转良好,但是本章中仍将专注讲解更先进的PDO扩展.创建的PDO扩展

《PHP精粹:编写高效PHP代码》——2.6节处理PDO中的错误

2.5 处理PDO中的错误 当你刚开始使用PDO时,它的某个方面是令人惊讶或让人沮丧的(视你的态度而定),即当它出现问题时,并不总是显而易见的.当我们第一次连接到数据库时,就会看到一个失败的连接会导致抛出一个异常.这里有一个提醒的代码: 一般来说,当某些引人注目的事情发生时PDO会抛出异常,但是如果你的查询由于某些原因而未能运行时,你也不必为此大惊小怪.这表明我们要仔细检查一切是否按照我们所预期的那样运行. 让我们复习一下迄今为止所学到的相关内容,看看我们如何对出现的问题进行识别和反应. 2.5

《PHP精粹:编写高效PHP代码》——2.6节高级PDO特征

2.6 高级PDO特征 我们已经看到PDO功能构成了以数据库驱动的PHP应用程序的主体.然而, PDO还有几个锦囊妙计需要我们好好研究.下面两节将显示我们如何利用数据库的事务,以及如何在PHP代码中调用存储过程. 2.6.1 事务和PDO 在数据库术语中事务(transaction)是一组必须执行的语句的集合.这组语句要么必须全部顺利完成,要么一个也不运行.不是所有的数据库都支持事务,有些支持,有些不支持,有些经过配置以后才会支持.对于MySQL,有些表的类型难以获得事务支持. 如果数据库不支持

《PHP精粹:编写高效PHP代码》——1.2节OOP简介

1.2 OOP简介 开始冒险吧!在理论知识方面,我们会结合代码示例来讲解,这让你更容易看懂代码的实际意义. 1.2.1 声明类 类相当于蓝图,是表明如何创建对象的一组指令.它还不是一个对象,而仅仅是对象的一个描述.在Web应用程序中,用类来表示各种实体.下面是一个可能用于电子商务应用程序中的Courier类: 以上代码表明了如何声明类,可以将Courier类保存在一个名为courier.php的文件中.这个文件的命名方法是需要牢记的一个要点,其重要性在1.3节中会详细阐述,我们会讲解当需要时如何