澳门新浦京手机版PHP serialize & JSON 解析

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

对于JSON(JavaScript Object
Notation)大家应该不陌生,它是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScript
Programming Language, Standard
ECMA-262 3rd Edition – December
1999的一个子集。JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C,
C++, C#, Java, JavaScript, Perl,
Python等)。这些特性使JSON成为理想的数据交换语言。

最近需要对大数组做存储,需要在serialize序列化和json之间做了选择。因此需要做了性能测试。

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

JSON建构于两种结构:

在php5.2之前对数组存储的时候,大都使用serialize系列化。php5.2之后,开始内置了 JSON 的支持。

澳门新浦京手机版 1

“名称/值”对的集合(A collection of name/value
pairs)。不同的语言中,它被理解为对象(object),纪录(record),结构(struct),字典(dictionary),哈希表(hash
table),有键列表(keyed list),或者关联数组 (associative array)。

值的有序列表(An ordered list of
values)。在大部分语言中,它被理解为数组(array)。

在网上看到有些资料说:json_encode和json_decode比内置的serialize和unserialize函数要高效。耳闻不如眼见,眼见不一定为实。那就用实际数据测试吧…..

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(字符串)。

PHP的serialize是将变量序列化,返回一个具有变量类型和结构的字符串表达式,
说起来两者都是以一种字符串的方式来体现一种数据结构,那它们之间有什么区别呢。

我们先理解概念:

澳门新浦京手机版,2)?? — 空接合操作符(PHP7)

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

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

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

//Result: abc123

先从JSON说起,看一个简单的实例。
例一:

一、 序列化

序列化是将对象状态转换为可保持或可传输的格式的过程。与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据。

将对象的状态信息转换为可以存储或传输的窗体的过程。
在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。

通常,对象实例的所有字段都会被序列化,这意味着数据会被表示为实例的序列化数据。这样,能够解释该格式的代码有可能能够确定这些数据的值,而不依赖于该成员的可访问性。类似地,反序列化从序列化的表示形式中提取数据,并直接设置对象状态,这也与可访问性规则无关。
对于任何可能包含重要的安全性数据的对象,如果可能,应该使该对象不可序列化。如果它必须为可序列化的,请尝试生成特定字段来保存不可序列化的重要数据。如果无法实现这一点,则应注意该数据会被公开给任何拥有序列化权限的代码,并确保不让任何恶意代码获得该权限。

3)匿名类(PHP7)

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

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

//Result: Hello!

var test = {“Name”:”Peter”,”Age”:20};
document.write(test.Name + “: ” + test.Age);

二、 JSON

JSON,JavaScript
Object
Notation,一种更轻、更友好的用于接口(AJAX、REST等)数据交换的格式。
JSON是结构化数据串行化的文本格式,作为XML的一种替代品,用于表示客户端与服务器间数据交换有效负载的格式。它是从ECMAScript语言标准衍生而来的。JSON的设计目标是使它成为小的、轻便的、文本的,而且是JavaScript的一个子集。JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C,
C++, C#, Java, JavaScript, Perl,
Python等)。这些特性使JSON成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成。

JSON建构有两种结构:

  1. “名称/值”对的集合(A
    collection of name/value
    pairs)。不同的语言中,它被理解为对象(object),记录(record),结构(struct),字典(dictionary),哈希表(hash
    table),有键列表(keyed list),或者关联数组 (associative
    array)。

2.值的有序列表(An ordered
list of
values)。在大部分语言中,它被理解为数组(array)。

测试:

4)Reflection

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

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

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

更多信息请看这里:

显示结果:

三、 实际测试

在PHP
5.3下执行:我们先使用小的数据做测试:

<?php  
$target = array (  
   'battle_id'=> 257  
   ,'user_id'=> 41248  
   ,'user_id2'=> 23989  
   ,'player'=> 41248  
   ,'formation'=> Array  
        (  
           '41248'=> 1  
           ,'23989'=> 2  
        )  

   ,'result'=> 1  
   ,'battle_type'=> 1  
   ,'speed'=> Array  
        (  
           '41248'=> 0  
           ,'23989'=> 0  
        )  
        );  

$json = json_encode($target);  
$seri = serialize($target);  

echo "json :" , strlen($json) ,'<br/>';  
echo "serialize :", strlen($seri) ,'<br/>';  

$stime = microtime(true);  
for ($i = 0; $i < 10000; $i ++) {  
    json_encode($target);  
}  
$etime = microtime(true);  

echo "json_encode :", ($etime - $stime) ,'<br/>';  

//----------------------------------  

$stime = microtime(true);  
for ($i = 0; $i < 10000; $i ++) {  
   json_decode($json,true);  
}  
$etime = microtime(true);  

echo "json_decode :", ($etime - $stime),'<br/>';  

//----------------------------------  
$stime = microtime(true);  
for ($i = 0; $i < 10000; $i ++) {  
    serialize($target);  
}  
$etime = microtime(true);  

echo "serialize :", ($etime - $stime) ,'<br/>';  

//----------------------------------  
$stime = microtime(true);  
for ($i = 0; $i < 10000; $i ++) {  
    unserialize($seri);  
}  
$etime = microtime(true);  

echo "unserialize :", ($etime - $stime),'<br/>';  

?>  

测试结果:

json :156
serialize :222
json_encode :0.1087498664856
json_decode :0.12652111053467
serialize :0.041656017303467
unserialize :0.040987968444824

测试结果看出json效率稍微比serialize差点,在php5.2可能会更差。应该是在php5.3之后,json扩展做了优化。

然后使用大数组做测试(代码放到最后,因为代码的数组比较长):

测试结果:

json :5350
serialize :8590
json_encode :0.90479207038879
json_decode :1.753741979599
serialize :1.3566699028015
unserialize :1.3003630638123

我们可以看出,serialize比json差了快一个数量级。

总结:

1)
空间的比较

serialize在编码后大概是json的1.5倍。

原因:

  • serialize后字符串包含了子串的长度,这可能是速度方面的优化,但是测试结果不尽人意
  • serialize有更加详细的类型区分,而json只有四种类型,并且是以简单的符号表示。
  • 2)速度的比较
  • 在较小数据的情况下, serialize比json快数量级。

    在大数据量的情况下,json比serialize稍微差一点

    3)处理对象
    json无法处理对象方法等数据。

    4)使用范围

    • 序列化使用serialize,特别是对象的存储。这是其存在的意义。
    • 与对象无关的数据存储可以使用json,如包含大量数字的数组等。
      • 在前后端交互一般都使用JSON,另外,目前JSON只支持UTF-8编码的数据。
<?php

$target = array (
   'battle_id'=> 257
   ,'user_id'=> 41248
   ,'user_id2'=> 23989
   ,'player'=> 41248
   ,'formation'=> Array ('41248'=> 1  ,'23989'=> 2)
   ,'result'=> 1
   ,'battle_type'=> 1
   ,'speed'=> Array( '41248'=> 0,'23989'=> 0  )
   ,'attacker'=> Array(
    '1'=> Array (
                   'user_id'=> 41248
                   ,'soldier_id'=> 28
                   ,'prototype_id'=> 4
                   ,'bid'=> 1
                   ,'level'=> 1
                   ,'rare'=> 1
                   ,'skill_id'=> 1
                   ,'totalhp'=> 3997
                   ,'hp'=> 3997
                   ,'attack_general'=> 346
                   ,'attack_skill'=> 596
                   ,'attack_explode'=> 458
                   ,'attack_type'=> 1
                   ,'defense'=> 0
                   ,'anger'=> 50
                   ,'dodge'=> 2
                   ,'crit'=> 2
                   ,'block'=> 2
                   ,'block_effect'=> 0.5
                   ,'crit_effect'=> 2
                   ,'foramtion_effect'=> 0)
           ,'4'=> Array (
                   'user_id'=> 41248
                   ,'soldier_id'=> 29
                   ,'prototype_id'=> 2
                   ,'bid'=> 1
                   ,'level'=> 1
                   ,'rare'=> 1
                   ,'skill_id'=> 1
                   ,'totalhp'=> 3555
                   ,'hp'=> 3555
                   ,'attack_general'=> 396
                   ,'attack_skill'=> 581
                   ,'attack_explode'=> 418
                   ,'attack_type'=> 1
                   ,'defense'=> 0
                   ,'anger'=> 50
                   ,'dodge'=> 2
                   ,'crit'=> 2
                   ,'block'=> 0
                   ,'block_effect'=> 0.5
                   ,'crit_effect'=> 2
                   ,'foramtion_effect'=> 0
                )
           ,'5'=> Array                (
                   'user_id'=> 41248
                   ,'soldier_id'=> 30
                   ,'prototype_id'=> 6
                   ,'bid'=> 1
                   ,'level'=> 1
                   ,'rare'=> 1
                   ,'skill_id'=> 1
                   ,'totalhp'=> 3043
                   ,'hp'=> 3043
                   ,'attack_general'=> 351
                   ,'attack_skill'=> 540
                   ,'attack_explode'=> 474
                   ,'attack_type'=> 1
                   ,'defense'=> 0
                   ,'anger'=> 50
                   ,'dodge'=> 2
                   ,'crit'=> 2
                   ,'block'=> 0
                   ,'block_effect'=> 0.5
                   ,'crit_effect'=> 2
                   ,'foramtion_effect'=> 0)
           ,'7'=> Array (
                   'user_id'=> 41248
                   ,'soldier_id'=> 37
                   ,'prototype_id'=> 2
                   ,'bid'=> 1
                   ,'level'=> 1
                   ,'rare'=> 1
                   ,'skill_id'=> 1
                   ,'totalhp'=> 3491
                   ,'hp'=> 3491
                   ,'attack_general'=> 393
                   ,'attack_skill'=> 532
                   ,'attack_explode'=> 456
                   ,'attack_type'=> 1
                   ,'defense'=> 0
                   ,'anger'=> 50
                   ,'dodge'=> 2
                   ,'crit'=> 2
                   ,'block'=> 0
                   ,'block_effect'=> 0.5
                   ,'crit_effect'=> 2
                   ,'foramtion_effect'=> 0   ))
   ,'defender'=> Array(
           '2'=> Array(
                   'user_id'=> 23989
                   ,'soldier_id'=> 24
                   ,'prototype_id'=> 1
                   ,'bid'=> 1
                   ,'level'=> 1
                   ,'rare'=> 1
                   ,'skill_id'=> 1
                   ,'totalhp'=> 3230
                   ,'hp'=> 3230
                   ,'attack_general'=> 390
                   ,'attack_skill'=> 567
                   ,'attack_explode'=> 442
                   ,'attack_type'=> 1
                   ,'defense'=> 0
                   ,'anger'=> 50
                   ,'dodge'=> 2
                   ,'crit'=> 2
                   ,'block'=> 0
                   ,'block_effect'=> 0.5
                   ,'crit_effect'=> 2
                   ,'foramtion_effect'=> 0)
           ,'5'=> Array(
                   'user_id'=> 23989
                   ,'soldier_id'=> 25
                   ,'prototype_id'=> 2
                   ,'bid'=> 1
                   ,'level'=> 1
                   ,'rare'=> 1
                   ,'skill_id'=> 1
                   ,'totalhp'=> 3400
                   ,'hp'=> 3400
                   ,'attack_general'=> 379
                   ,'attack_skill'=> 536
                   ,'attack_explode'=> 405
                   ,'attack_type'=> 1
                   ,'defense'=> 0
                   ,'anger'=> 50
                   ,'dodge'=> 2
                   ,'crit'=> 2
                   ,'block'=> 0
                   ,'block_effect'=> 0.5
                   ,'crit_effect'=> 2
                   ,'foramtion_effect'=> 0 )
           ,'7'=> Array(
                   'user_id'=> 23989
                   ,'soldier_id'=> 26
                   ,'prototype_id'=> 6
                   ,'bid'=> 1
                   ,'level'=> 1
                   ,'rare'=> 1
                   ,'skill_id'=> 1
                   ,'totalhp'=> 3669
                   ,'hp'=> 3669
                   ,'attack_general'=> 362
                   ,'attack_skill'=> 549
                   ,'attack_explode'=> 426
                   ,'attack_type'=> 1
                   ,'defense'=> 0
                   ,'anger'=> 50
                   ,'dodge'=> 2
                   ,'crit'=> 2
                   ,'block'=> 0
                   ,'block_effect'=> 0.5
                   ,'crit_effect'=> 2
                   ,'foramtion_effect'=> 0 )
           ,'9'=> Array(
                   'user_id'=> 23989
                   ,'soldier_id'=> 27
                   ,'prototype_id'=> 1
                   ,'bid'=> 1
                   ,'level'=> 1
                   ,'rare'=> 1
                   ,'skill_id'=> 1
                   ,'totalhp'=> 3618
                   ,'hp'=> 3618
                   ,'attack_general'=> 326
                   ,'attack_skill'=> 510
                   ,'attack_explode'=> 419
                   ,'attack_type'=> 1
                   ,'defense'=> 0
                   ,'anger'=> 50
                   ,'dodge'=> 2
                   ,'crit'=> 2
                   ,'block'=> 0
                   ,'block_effect'=> 0.5
                   ,'crit_effect'=> 2
                   ,'foramtion_effect'=> 0) )
   ,'battle_process'=> Array(
           '0'=> Array(
                   'user_id'=> 41248
                   ,'asid'=> 28
                   ,'bsid'=> Array( '0'=> 26 )
                   ,'harm'=> Array('0'=> 1650)
                   ,'dhp'=> Array('0'=> 2019  )
                   ,'attacker_anger'=> 66
                   ,'defender_anger'=> Array('0'=> 94 )
                   ,'skill'=> 0
                   ,'state'=> 0
                )

           ,'1'=> Array(
                   'user_id'=> 41248
                   ,'asid'=> 28
                   ,'bsid'=> Array( '0'=> 26 )
                   ,'harm'=> Array('0'=> 1650)
                   ,'dhp'=> Array('0'=> 2019  )
                   ,'attacker_anger'=> 66
                   ,'defender_anger'=> Array('0'=> 94 )
                   ,'skill'=> 0
                   ,'state'=> 0
                )

           ,'2'=> Array(
                   'user_id'=> 41248
                   ,'asid'=> 28
                   ,'bsid'=> Array( '0'=> 26 )
                   ,'harm'=> Array('0'=> 1650)
                   ,'dhp'=> Array('0'=> 2019  )
                   ,'attacker_anger'=> 66
                   ,'defender_anger'=> Array('0'=> 94 )
                   ,'skill'=> 0
                   ,'state'=> 0
                )
           ,'3'=> Array(
                   'user_id'=> 41248
                   ,'asid'=> 28
                   ,'bsid'=> Array( '0'=> 26 )
                   ,'harm'=> Array('0'=> 1650)
                   ,'dhp'=> Array('0'=> 2019  )
                   ,'attacker_anger'=> 66
                   ,'defender_anger'=> Array('0'=> 94 )
                   ,'skill'=> 0
                   ,'state'=> 0
                )

           ,'4'=> Array(
                   'user_id'=> 41248
                   ,'asid'=> 28
                   ,'bsid'=> Array( '0'=> 26 )
                   ,'harm'=> Array('0'=> 1650)
                   ,'dhp'=> Array('0'=> 2019  )
                   ,'attacker_anger'=> 66
                   ,'defender_anger'=> Array('0'=> 94 )
                   ,'skill'=> 0
                   ,'state'=> 0
                )
           ,'5'=> Array(
                   'user_id'=> 41248
                   ,'asid'=> 28
                   ,'bsid'=> Array( '0'=> 26 )
                   ,'harm'=> Array('0'=> 1650)
                   ,'dhp'=> Array('0'=> 2019  )
                   ,'attacker_anger'=> 66
                   ,'defender_anger'=> Array('0'=> 94 )
                   ,'skill'=> 0
                   ,'state'=> 0
                )

           ,'6'=> Array(
                   'user_id'=> 41248
                   ,'asid'=> 28
                   ,'bsid'=> Array( '0'=> 26 )
                   ,'harm'=> Array('0'=> 1650)
                   ,'dhp'=> Array('0'=> 2019  )
                   ,'attacker_anger'=> 66
                   ,'defender_anger'=> Array('0'=> 94 )
                   ,'skill'=> 0
                   ,'state'=> 0
                )

           ,'7'=> Array(
                   'user_id'=> 41248
                   ,'asid'=> 28
                   ,'bsid'=> Array( '0'=> 26 )
                   ,'harm'=> Array('0'=> 1650)
                   ,'dhp'=> Array('0'=> 2019  )
                   ,'attacker_anger'=> 66
                   ,'defender_anger'=> Array('0'=> 94 )
                   ,'skill'=> 0
                   ,'state'=> 0
                )
           ,'8'=> Array(
                   'user_id'=> 41248
                   ,'asid'=> 28
                   ,'bsid'=> Array( '0'=> 26 )
                   ,'harm'=> Array('0'=> 1650)
                   ,'dhp'=> Array('0'=> 2019  )
                   ,'attacker_anger'=> 66
                   ,'defender_anger'=> Array('0'=> 94 )
                   ,'skill'=> 0
                   ,'state'=> 0
                )

           ,'9'=> Array(
                   'user_id'=> 41248
                   ,'asid'=> 28
                   ,'bsid'=> Array( '0'=> 26 )
                   ,'harm'=> Array('0'=> 1650)
                   ,'dhp'=> Array('0'=> 2019  )
                   ,'attacker_anger'=> 66
                   ,'defender_anger'=> Array('0'=> 94 )
                   ,'skill'=> 0
                   ,'state'=> 0
                )
           ,'10'=> Array(
                   'user_id'=> 41248
                   ,'asid'=> 28
                   ,'bsid'=> Array( '0'=> 26 )
                   ,'harm'=> Array('0'=> 1650)
                   ,'dhp'=> Array('0'=> 2019  )
                   ,'attacker_anger'=> 66
                   ,'defender_anger'=> Array('0'=> 94 )
                   ,'skill'=> 0
                   ,'state'=> 0
                )
           ,'11'=> Array(
                   'user_id'=> 41248
                   ,'asid'=> 28
                   ,'bsid'=> Array( '0'=> 26 )
                   ,'harm'=> Array('0'=> 1650)
                   ,'dhp'=> Array('0'=> 2019  )
                   ,'attacker_anger'=> 66
                   ,'defender_anger'=> Array('0'=> 94 )
                   ,'skill'=> 0
                   ,'state'=> 0
                )

           ,'12'=> Array(
                   'user_id'=> 41248
                   ,'asid'=> 28
                   ,'bsid'=> Array( '0'=> 26 )
                   ,'harm'=> Array('0'=> 1650)
                   ,'dhp'=> Array('0'=> 2019  )
                   ,'attacker_anger'=> 66
                   ,'defender_anger'=> Array('0'=> 94 )
                   ,'skill'=> 0
                   ,'state'=> 0
                )
           ,'13'=> Array(
                   'user_id'=> 41248
                   ,'asid'=> 28
                   ,'bsid'=> Array( '0'=> 26 )
                   ,'harm'=> Array('0'=> 1650)
                   ,'dhp'=> Array('0'=> 2019  )
                   ,'attacker_anger'=> 66
                   ,'defender_anger'=> Array('0'=> 94 )
                   ,'skill'=> 0
                   ,'state'=> 0
                )
           ,'14'=> Array(
                   'user_id'=> 41248
                   ,'asid'=> 28
                   ,'bsid'=> Array( '0'=> 26 )
                   ,'harm'=> Array('0'=> 1650)
                   ,'dhp'=> Array('0'=> 2019  )
                   ,'attacker_anger'=> 66
                   ,'defender_anger'=> Array('0'=> 94 )
                   ,'skill'=> 0
                   ,'state'=> 0
                )

           ,'15'=> Array(
                   'user_id'=> 41248
                   ,'asid'=> 28
                   ,'bsid'=> Array( '0'=> 26 )
                   ,'harm'=> Array('0'=> 1650)
                   ,'dhp'=> Array('0'=> 2019  )
                   ,'attacker_anger'=> 66
                   ,'defender_anger'=> Array('0'=> 94 )
                   ,'skill'=> 0
                   ,'state'=> 0
                )
           ,'16'=> Array(
                   'user_id'=> 41248
                   ,'asid'=> 28
                   ,'bsid'=> Array( '0'=> 26 )
                   ,'harm'=> Array('0'=> 1650)
                   ,'dhp'=> Array('0'=> 2019  )
                   ,'attacker_anger'=> 66
                   ,'defender_anger'=> Array('0'=> 94 )
                   ,'skill'=> 0
                   ,'state'=> 0
                )
           ,'17'=> Array(
                   'user_id'=> 41248
                   ,'asid'=> 28
                   ,'bsid'=> Array( '0'=> 26 )
                   ,'harm'=> Array('0'=> 1650)
                   ,'dhp'=> Array('0'=> 2019  )
                   ,'attacker_anger'=> 66
                   ,'defender_anger'=> Array('0'=> 94 )
                   ,'skill'=> 0
                   ,'state'=> 0
                )

           ,'18'=> Array(
                   'user_id'=> 41248
                   ,'asid'=> 28
                   ,'bsid'=> Array( '0'=> 26 )
                   ,'harm'=> Array('0'=> 1650)
                   ,'dhp'=> Array('0'=> 2019  )
                   ,'attacker_anger'=> 66
                   ,'defender_anger'=> Array('0'=> 94 )
                   ,'skill'=> 0
                   ,'state'=> 0
                )
           ,'19'=> Array(
                   'user_id'=> 41248
                   ,'asid'=> 28
                   ,'bsid'=> Array( '0'=> 26 )
                   ,'harm'=> Array('0'=> 1650)
                   ,'dhp'=> Array('0'=> 2019  )
                   ,'attacker_anger'=> 66
                   ,'defender_anger'=> Array('0'=> 94 )
                   ,'skill'=> 0
                   ,'state'=> 0
                )

           ,'20'=>Array(
                   'user_id'=> 41248
                   ,'asid'=> 28
                   ,'bsid'=> Array( '0'=> 26 )
                   ,'harm'=> Array('0'=> 1650)
                   ,'dhp'=> Array('0'=> 2019  )
                   ,'attacker_anger'=> 66
                   ,'defender_anger'=> Array('0'=> 94 )
                   ,'skill'=> 0
                   ,'state'=> 0
                )
        )

);


$json = json_encode($target);
$seri = serialize($target);

echo "json :" , strlen($json) ,'<br/>';
echo "serialize :", strlen($seri) ,'<br/>';

$stime = microtime(true);
for ($i = 0; $i < 10000; $i ++) {
    json_encode($target);
}
$etime = microtime(true);

echo "json_encode :", ($etime - $stime) ,'<br/>';

//----------------------------------

$stime = microtime(true);
for ($i = 0; $i < 10000; $i ++) {
   json_decode($json,true);
}
$etime = microtime(true);

echo "json_decode :", ($etime - $stime),'<br/>';

//----------------------------------
$stime = microtime(true);
for ($i = 0; $i < 10000; $i ++) {
    serialize($target);
}
$etime = microtime(true);

echo "serialize :", ($etime - $stime) ,'<br/>';

//----------------------------------
$stime = microtime(true);
for ($i = 0; $i < 10000; $i ++) {
    unserialize($seri);
}
$etime = microtime(true);

echo "unserialize :", ($etime - $stime),'<br/>';

?>

5)短数组初始化

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

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

Peter: 20

6)DateTime类

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

更多信息请看这里:

变量test中{“Name”:”Peter”,”Age”:20}为一个有2个元素的对象(感觉就像PHP的数组):
Name为Peter,Age为20。

7)Lambda表达式/匿名函数

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

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

$sayHi("Peter");

更多信息请看这里:

当然也可以变得复杂些。
例二:

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表达式的时候更为明显),所以要慎用于那些非常大的数组。

更多信息请看这里:

var test = {“User”:{“Name”:”Peter”,”Age”:20},”Company”:”FORD”};
document.write(test.User.Name + “: ” + test.Company);

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"}

更多信息请看这里:

显示结果:

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特性你一定要熟悉,感谢您的阅读。

Peter: FORD

这个例子中User元素中包含了Name和Age。

如果要体现多个User,则需要使用数组,区别于对象的”{}”,数组使用”[]”。
例三:

var test = [
                 {“User”:{“Name”:”Peter”,”Age”:20},”Company”:”FORD”},
                 {“User”:{“Name”:”Li Ming”,”Age”:20},”Company”:”Benz”}
              ];
document.write(test[1].User.Name + “: ” + test[1].Company);
//或者使用:document.write(test[1][“User”][“Name”] + “: ” + test[1][“Company”]);

显示结果:

Li Ming: Benz

通过以上简单实例就能将一些复杂数据通过一个字符串来进行传递,再配合上Ajax的确是方便很多。
下面再来看看PHP的serialize函数的作用。
例四:

$arr = array
       (
          ‘Peter’=> array
          (
            ‘Country’=>’USA’,
            ‘Age’=>20
          ),
          ‘Li Ming’=> array
          (
             ‘Country’=>’CHINA’,
             ‘Age’=>21
          )
        );

$serialize_var = serialize($arr);
echo $serialize_var;

显示结果:

a:2:{s:5:”Peter”;a:2:{s:7:”Country”;s:3:”USA”;s:3:”Age”;i:20;}s:7:”Li Ming”;a:2:{s:7:”Country”;s:5:”CHINA”;s:3:”Age”;i:21;}}

这个结果看上去比JSON要复杂一些,其实也很简单,它说明的就是一些数据类型和结构。
以a:2:{s:7:”Country”;s:3:”USA”;s:3:”Age”;i:20;}为例:
      a:2说明这是个有两个元素的数组(array),
      s:7:”Country”;s:3:”USA”;为第一个元素,s:7说明这是有7个字符的字符串(string),
      后面i:20;也应该猜得到是整数(integer)20。

再来看一下这个例子,
例五:

class test
{
    var $var = 0;
    function add(){
      echo $var+10;
    }
}

$unserialize_var = new test;
$serialize_var = serialize($unserialize_var);
echo $serialize_var;
$unserialize_var = null;
$unserialize_var = unserialize($serialize_var);
$unserialize_var->add();

显示结果:

O:4:”test”:1:{s:3:”var”;i:0;}
10

从这个例子中可以看出来,serialize对数据的类型和结构都进行的保存,
unserialize后的变量仍然可以使用add()方法。

那么PHP和JSON有没有联系呢,熟悉PHP的朋友应该了解PHP5.2.0已经将JSON
extension设置为默认组件,也就是说我们可以在PHP中进行JSON操作,其函数为json_encode和json_decode。
例六:

$arr = array
       (
          ‘Name’=>’Peter’,
          ‘Age’=>20
       );

$jsonencode = json_encode($arr);
echo $jsonencode;

显示结果:

{“Name”:”Peter”,”Age”:20}

这个结果和例一中test值是一样的,通过json_encode将PHP中的变量转换为JSON字符出表达式。
再来看看json_decode的用法。
例七:

$var = ‘{“Name”:”Peter”,”Age”:20}’;
$jsondecode = json_decode($var);
print_r($jsondecode);

显示结果:

stdClass Object ( [Name] => Peter [Age] => 20 )

这的确验证了,在JSON中{“Name”:”Peter”,”Age”:20}是一个对象,但是在PHP中也可以将其转为数组,在json_decode中将ASSOC参数设置为True即可。
例八:

$var = ‘{“Name”:”Peter”,”Age”:20}’;
$jsondecode = json_decode($var,true);
print_r($jsondecode);

显示结果:

Array ( [Name] => Peter [Age] => 20 )

另,需要注意的是JSON是基于Unicode格式,所以要进行中文操作要将其转化为UTF-8格式。
通过上面这些例子相信大家对于JSON和PHP的serialize、json_encode都有了初步了解,
结合PHP、Javascript、JSON以及Ajax就可以完成强大的数据交互功能。

相关参考资料:
PHP JSON Functions:
JSON Introduction:http://www.json.org/json-zh.html 网友实例:
http://www.only4.cn/archives/95              

发表评论

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