PHP的serialize序列化数据以及JSON格式化数据分析_php技巧_脚本之家

本文由码农网 –
小峰原创翻译,转载请看清文末的转载要求,欢迎参与我们的付费投稿计划!

PHP的serialize是将变量序列化,返回一个具有变量类型和结构的字符串表达式,而JSON则是一种更轻、更友好的用于接口数据交换的格式。
其实两者都是以一种字符串的方式来体现一种数据结构。那么他们之间又有什么区别呢?serialize序列化我们在一些老的WEB系统中可能会看到在数据库或在文本文件中存储着一大串貌似有着特殊含义的字符串文本内容。我们仔细看会发现它具有数据类型和结构等信息,但是它并不容易人工阅读,它只适合PHP程序读取。PHP的serialize将数组进行了序列化并存储。我们假设有这样一个数组:

我以前用的最熟的PHP版本是php5.2,对php5.3的新增特性也略有了解,但是之后的就没有系统的学习过,今天发现php7的三目运算符有一个新加的,长这个样子“??”,外加
php7.1
即将发布,感觉有必要系统的补充一下,提升代码的质感。个人还是蛮喜欢php5.2之后的语法变化的,有利于缩减代码的结构复杂度,还有行数

本文主要总结了10个PHP特性,这些PHP特性对于PHP开发者来说都是应该学习和使用的,译文如下:

$arr = array( "0" => array( "gameName" => "德乙", "homeName" => "比勒费尔德", "guestName" => "不伦瑞克", "endTime" => "2015-08-21" ), "1" => array( "gameName" => "英超", "homeName" => "水晶宫", "guestName" => "阿斯顿维拉", "endTime" => "2015-08-22" ) ); 

官方有详细的功能实现列表,其中可以找到所有未来可能会出现的新变化:
https://wiki.php.net/rfc

图片 1

我们要将这个数组内容存储在数据库或者文本文件中,以便其他地方读取。

《PHP 5.3、5.4、5.5、5.6
中的新特性》
《PHP7发布。最好语言发布了新版本》
《PHP 7.1
新特性一览》

1)标量类型声明(PHP7)

PHP是一种松散类型的编程语言,因此没有提供任何指定输入参数类型和返回值类型的方法。
PHP7通过以下语法改变了这个现象:

function add(int $x, int $y) : int
{
    return $x + $y;
}

echo add(1, 2);

有效类型为:类/接口名称,self,array(数组),callable(回调类型),bool(布尔型),float(浮点型),int(整型)和string(字符串)。

$serialize = serialize; echo $serialize; 

这几篇文章已经整理的相当详细,这里标记一下方便自己复习:

2)?? — 空接合操作符(PHP7)

空接合操作符虽然小,但非常好用,是PHP7中新增加的。?? —
只要操作符的左边存在且不为空,就返回左边,否则就返回操作符的右边:

//$a is not defined
$b = NULL;
$c = "abc123";

echo($a ?? $b ?? $c);

//Result: abc123

我们使用PHP的serialize将数组进行序列化,输出以下结果:

php5.3

  • 支持命名空间
  • 增加后期静态绑定
  • 增加 goto 操作符
  • 添加了原生的闭包(Lambda/匿名函数)支持
  • 新增两个魔术方法, __callStatic 和 __invoke
  • 添加 Nowdoc 语法支持
  • Heredoc 结构中可以用双引号来声明标识符了
  • const 关键字可用来在类定义之外定义常量了
  • 三元运算符可以简写省略中间的部分
  • 异常可以嵌套了
  • 可以动态访问静态变量了
  • mail()函数支持记录发送日志了

3)匿名类(PHP7)

PHP7中还有一个新增的也很不错,那就是匿名类。有时候,我们只是没有必要创建一个命名的类,因为它的名字会导致当前命名空间的膨胀。语法非常简单:

echo (new class() {
    public function myMethod() {
      return "Hello!";
    }
})->myMethod();

//Result: Hello!
a:2:{i:0;a:4:{s:8:"gameName";s:6:"德乙";s:8:"homeName";s:15:"比勒费尔德";s:9:"guestName";s:12:"不伦瑞克";s:7:"endTime";s:10:"2015-08-21";}i:1;a:4:{s:8:"gameName";s:6:"英超";s:8:"homeName";s:9:"水晶宫";s:9:"guestName";s:15:"阿斯顿维拉";s:7:"endTime";s:10:"2015-08-22";}} 

php5.4

  • 新增 Traits
  • 新增短数组语法
  • 新增支持对函数返回数组的成员访问解析
  • 无论 php.ini 中是否设置 short_open_tag, 格式总是可用
  • 内置用于开发的 CLI 模式的 web server
  • 新增在实例化时访问类成员
  • 新增了动态访问静态方法的方式
  • 闭包支持 $this
  • 新增二进制直接量
  • session提供了上传进度支持
  • 默认使用 mysqlnd
  • 让 json 更懂中文
  • default_charset从ISO-8859-1已经变为UTF-8

4)Reflection

Reflection是一个用来获取有关运行时代码信息的强大框架。让你可以对类、接口、函数、方法和扩展执行反向工程,以构建映射引擎,IoC容器或文档框架等等。

下面是一个获取匿名类所有方法的简单例子:

$class = new ReflectionClass(new class() {
    public function getText() {
        return "Hello from anonymous class";
    }
});
$methods = $class->getMethods();
var_dump($methods);

更多信息请看这里:

以上输出的结果看上去比较复杂,其实也很简单,它说明的就是一些数据类型和结构。a:2说明这是个有两个元素的数组;i:0指序列索引;a:4指有4个字段s:8:”gameName”说明这是有8个字符的字符串实际开发中我们只将序列化后的数据进行存储,并不要去关心存储的格式和以及字段意思。如果要将序列化后的数据恢复成数组,则使用unserialize()函数即可。

php5.5

  • 引入生成器,新增 yield 关键字,方便做迭代相关的处理
  • 新增 finally 关键字,强化异常处理
  • foreach 支持 list(),强化处理二维数组的能力
  • empty() 支持传入一个任意表达式,而不仅是一个变量
  • 直接通过下标获取访问数组和字符串字面量的元素或字符
  • 新的密码哈希 API
  • 新增 boolval() 函数
  • 新增 array_column() 函数

5)短数组初始化

在用PHP编程的时候,我倾向于大量使用数组,因为它们不仅功能强大,而且简单易用。PHP的5.4.x版本使得更容易初始化:

$myArray = ["foo", "name" => "bar"];
print_r(unserialize; 

php5.6

  • 可以使用表达式定义常量,灵活多了
  • 使用 … 运算符定义变长参数函数,对形参进行强化
  • 使用 ** 进行幂运算
  • use 运算符可以在类中导入外部的函数和常量了
  • 加入 hash_equals()
    函数,以恒定的时间消耗来进行字符串比较,以避免时序攻击
  • 加入 __debugInfo(),配合 var_dump() 对类进行调试

6)DateTime类

PHP的5.2版本附带DateTime类作为首选的操纵和格式化日期和时间的方式。

更多信息请看这里:

以上代码可以打印出数组。JSON数据解析我们知道,PHP操作JSON可以使用json_encode两个函数。json_encode()可以将数组转换成json格式的文本数据,它方便存储和读取,而json_decode()可以直接将json数据转换成数组,方便调用。

php7

  • 基本类型 String Int 也可以用来做类型声明
  • 可以对类的返回值类型进行声明了
  • 新增三目运算符 ?? 减少 isset() 的使用
  • 增加组合比较符 <=>
  • 常量可以被定义为数组了
  • 类也可以匿名了,可以通过 new class 来实现
  • 支持 Unicode codepoint 转译语法
  • Closure::call() 暂时绑定一个方法到对象上闭包并立即调用它
  • 为 unserialize() 增加过滤参数
  • 对 assert() 函数进行功能加强,是单元测试的好伙伴
  • use 语法支持一次性的导入多个类
  • 增加 random_bytes() 和 random_int() 方便取随机数
  • preg_replace_callback_array() 可以传多个匿名函数构成的数组进去
  • session_start() 新增参数可以修改系统设定值
  • Generator::getReturn() 获取生成器的返回值
  • 生成器中可以引入其他生成器

7)Lambda表达式/匿名函数

匿名函数(有时也被称为lambda表达式)是没有指定名称的函数。匿名函数可以被分配给一个变量,如下例所示:

$sayHi = function($toName) {
    echo("Hi " . $toName);
};

$sayHi("Peter");

更多信息请看这里:

$jsonencode = json_encode; echo $jsonencode; 

[{"gameName":"u5fb7u4e59","homeName":"u6bd4u52d2u8d39u5c14u5fb7","guestName":"u4e0du4f26u745eu514b","endTime":"2015-08-21"},{"gameName":"u82f1u8d85","homeName":"u6c34u6676u5bab","guestName":"u963fu65afu987fu7ef4u62c9","endTime":"2015-08-22"}] 

php7.1

  • 参数类型声明和函数返回值声明允许前置“?”操作符,表示一个可空类型
  • foreach 里面的 list
    可以用“[]”的形式来表示了,看起来像数组的赋值过程
  • list 在使用的时候允许制定一个 key 值
  • 新增 void 返回类型
  • 类常量开始支持 public private 和 protected
  • 异常处理的时候,catch() 可以捕获多个不同的异常
  • 字符串下标取值支持负数

8)array_map

array_map是一个不错的函数,能帮助你对数组中的每个元素执行计算。这在混合了匿名函数/
lambda表达式的时候特别好用。无论你为数组中的元素提供什么方法,array_map函数都适用:

$nameLengths = array_map(function($item) {
    return strlen($item); }, ["Sue", "Peter", "Michael"]);

//Result: 3, 5, 7

需要注意的是,array_map可能会比foreach慢一点儿(特别当混合使用lambda表达式的时候更为明显),所以要慎用于那些非常大的数组。

更多信息请看这里:

很显然,使用JSON后,数据空间要比serialize少,输出的结果中中文字符串经过编码,仔细看是键值对应,便于人工识别,而且关键是JSON格式的数据方便其他语种读取并识别,所以有人说它是XML替代品。JSON格式的数据能和WEB前端JS完成异步交互过程。如果要将json还原成数组,可以使用json_decode()函数。print_r(json_decode;
关于JSON的应用有兴趣的同学可以参考本站文章:PHP中JSON的应用总结PHP的serialize将数组序列化后是便于存储,而JSON格式的数据不仅便于存储还能跟其他语言如javascript读取。它们在性能上可能会有细微区别,如果前后端交互使用比较多的话建议使用JSON,结合PHP、Javascript、JSON以及Ajax就可以完成强大的数据交互功能。

9)json_encode()和json_decode()

我最近倾向于大量使用JSON序列化和反序列化。PHP的json_encode和json_decode函数对此提供了大力支持。需要注意的是,json_encode会忽略私有成员:

class car {
    public $make = "Tesla";
    public $model ="Model S";
    private $errorCodes = ['34343', '545344'];
}     
$carAsJson = json_encode(new car());

//Result: {"make":"Tesla","model":"Model S"}

更多信息请看这里:

关于PHP的serialize序列化数据以及JSON格式化数据详细分析就这么多,如果想了解更多的内容请继续关注。

10)密码的哈希(hashing)和验证

PHP通过password_hash和password_verify函数,用一种安全的方式来大力支持密码的哈希和验证。因为使用非常简单,所以我们就没有必要重新发明轮子了。想查看案例的话,请点击下面的文章:

http://www.codeaddiction.net/articles/4/hash-and-verify-passwords-in-php—the-right-way

作为PHP程序员,以上这10个PHP特性你一定要熟悉,感谢您的阅读。

发表评论

电子邮件地址不会被公开。 必填项已用*标注