由于PHP“百家争鸣”的蛋疼语法和糟糕的社区氛围,很多人对新版本和新特性不感兴趣。本文将介绍从PHP5.2到PHP5.6增加的新特性。
本文目录:PHP 5.2之前:autoload、PDO和MySQLi、类型约束PHP 5.2: JSON支持PHP5.3:弃用函数、匿名函数、新魔术方法、名称空间、后期静态绑定、Heredoc和Nowdoc、const、三元运算符、PharPHP5.4:短开标签、短数组形式、Traits、内置Web服务器、细节修改PHP 5.5: yield、list () for foreach、细节修改PHP5.6:常量增强、变量函数参数、名称空间增强
一、PHP5.2以前(2006前)顺便介绍一下PHP5.2已经出现但值得介绍的特性。autoload大家可能都知道__autoload()函数。如果定义了这个函数,当代码中使用了未定义的类时,就会调用这个函数。可以在这个函数中加载相应的类实现文件,比如复制代码如下:function _ _ autoload($ class name){ require _ once({ $ class name })。PHP')}但是现在已经不推荐这个函数了,因为一个项目中只能有一个这样的_ _ autoload()函数,因为PHP不允许函数重名。但是在使用一些类库的时候,不可避免的会有多个自动加载函数的需求,所以spl_autoload_register()取而代之:复制代码如下:spl _ autoload _ register(function($ class name){ require _ once({ $ class name })。PHP ')});Spl_autoload_register()将在自动加载函数列表中注册一个函数。当出现未定义的类时,SPL[注意]会按照注册的相反顺序逐个调用已注册的autoload函数。这意味着您可以使用spl_autoload_register()来注册多个自动加载函数。注:SPL:标准PHP库,一个标准的PHP库,旨在解决一些经典问题(如数据结构)。
PDO 和 MySQLi是PHP数据对象,PHP是PHP新的数据库访问接口。按照传统风格,访问MySQL数据库应该是这样的:复制代码code如下://连接到服务器,选择数据库$ conn=mysql _ connect ('localhost ',' user ',' password ');mysql_select_db('数据库');
//执行SQL查询$ type=$ _ POST[' type '];$ SQL=' SELECT * FROM ` table ` WHERE ` type `={ $ type } ';$ result=MySQL _ query($ SQL);
//打印结果while($ row=MySQL _ fetch _ array($ result,MySQL _ assoc)){ foreach($ row as $ k=$ v)print ' { $ k }:{ $ v } \ n ';}
//释放结果集,关闭连接MySQL _ free _ result($ result);MySQL _ close($ conn);为了使代码与数据库无关,即一段代码可以同时适用于多个数据库(例如以上代码只适用于MySQL),PHP官方设计了PDO。除此之外,PDO还提供了更多的功能,比如:
1.面向对象的接口2。SQL预编译,占位符语法3。更高的执行效率,作为官方推荐,具有特殊的性能优化4。支持大多数SQL数据库,改变数据库而不改变代码。
上面的代码将在PDO实现如下:复制代码如下://连接数据库$ conn=new PDO(' MySQL:host=localhost;dbname=数据库','用户','密码');
//使用绑定参数$ query=$ conn-prepare(' select * from ` table ` where ` type `=:type ')预编译SQL$query-bindParam('type ',$ _ POST[' type ']);
//执行查询并打印结果foreach($ query-Execute()as $ row){ foreach($ row as $ k=$ v)print ' { $ k }:{ $ v } \ n ';}PDO是政府推荐的一种更通用的数据库访问方法。如果你没有特别的需求,那么你最好学习和使用PDO。但是如果你需要使用MySQL独有的高级功能,那么你可能需要尝试MySQL,因为PDO不会为了能够同时在多个数据库上使用而包含MySQL的那些独有功能。
MySQL是MySQL的增强接口,同时提供面向流程和面向对象的接口。也是目前推荐的MySQL驱动,以后默认关闭老C风格的MySQL接口。和上面两个代码相比,MySQLi的用法没有太多新概念,这里就不举例了。请参考PHP官网文档【注意】。
注:http://www.php.net/manual/en/mysqli.quickstart.php
类型约束可以通过类型约束来限制参数的类型,但是这种机制并不完善。目前只适用于类和callable(可执行类型)和array(数组),不适用于string和int。复制代码如下://限制第一个参数为MyClass,第二个参数为可执行类型,第三个参数为数组函数my function (my class $ a,callable $ b,array $ c) {//.}
PHP5.2(2006-2011):JSON 支持
包括json_encode()、json_decode()等函数。JSON是Web领域非常常见的数据交换格式,可以直接得到JS的支持。JSON实际上是JS语法的一部分。JSON系列函数,可以将PHP中的数组结构转换成JSON字符串:复制代码如下:$ array=['key'=' value ',' array'=[1,2,3,4]];$ JSON=JSON _ encode($ array);echo ' { $ json } \ n
$ object=JSON _ decode($ JSON);print _ r($ object);输出:复制真实代码如下:{'key':' value ',' array': [1,2,3,4]} STD class object([key]=value[array]=array([0]=1[1]=2[2]=3[3]=4)。
PHP5.3(2009-2012)PHP5.3是一个非常大的更新,增加了很多新特性,但也做了一些不是向后兼容的改动。【PHP5.3的弃用函数】:以下函数弃用。如果在配置文件中启用了它们,PHP将在运行时发出警告。
Register Globals这是php.ini中的一个选项(register_globals)当它被打开时,所有的表单变量($_GET和$_POST)将被注册为全局变量。看下面的例子:复制代码代码如下:if(is auth())$ authorized=true;if($ authorized)include(' page . PHP ');当这个代码被验证时,它将$authorized设置为true。然后根据$authorized的值决定是否显示页面。但是由于$authorized并没有提前初始化为false,所以在register_globals打开的时候就有可能访问/auth.php?Authorized=1定义变量值,绕过身份验证。这个特性是一个历史问题,在PHP4.2中默认关闭,在PHP5.4中移除。
Magic Quotes
对应php.ini中的选项magic_quotes_gpc,这个特性也是历史问题,在PHP5.4中已经被移除了,这个特性会对所有用户输入进行转义,看起来还不错。在第一章中,我们提到了转义用户输入。但是PHP不知道哪些输入会进入SQL,哪些输入会进入Shell,哪些输入会显示为HTML,所以很多时候这种转义会造成混乱。
安全模式很多虚拟主机提供商使用安全模式隔离多个用户,但是安全模式存在很多问题,比如有些扩展没有按照安全模式控制自己的权限。PHP的官方推荐是使用操作系统隔离权限的机制,使得Web服务器可以运行不同用户权限的PHP解释器。请参考第1章中的最小权限原则。
【PHP5.3的新增、改进】
匿名函数,也称为闭包,常用于临时创建一个匿名函数,用于回调函数和其他用途。复制代码如下:$ func=function($ arg){ print $ arg;};
$ func(' Hello World ');上面的代码定义了一个匿名函数,并将其赋给$func。可以看到function关键字还是用来定义匿名函数的,只是省略了函数名,直接使用了参数列表。然后我们调用了$func中存储的匿名函数。匿名函数也可以使用use关键字捕获外部变量:复制代码如下:函数array plus ($ array,$ num) {array _ walk ($ array,function($ v)use($ num){ $ v=$ num;});}上面的代码定义了一个arrayPlus()函数(这不是匿名函数),它会将数组($array)中的每一项加上指定的数字($num)。在arrayPlus()的实现中,我们使用了array_walk()函数,它会对一个数组中的每一项执行一个回调函数,也就是我们定义的匿名函数。在匿名函数的参数列表之后,我们使用use关键字将匿名函数之外的$num抓取到函数中,从而准确知道应该添加多少。
在魔术方法:__invoke(), __callStatic()PHP的面向对象系统中,提供了几个“魔术方法”来实现类似于其他语言的“重载”,比如在访问不存在的属性和方法时触发一个魔术方法。随着匿名函数的加入,PHP引入了一个新的神奇方法__invoke()。这个神奇的方法会在对象作为函数调用时被调用:复制代码如下:Class A { public function _ _ invoke($ str){ print ' A:_ _ invoke():{ $ str } ';}}
$a=新A;$ a(' Hello World ');毫无疑问输出是:复制代码如下:A:_ _ invoke():Hello World _ _ call static()在调用一个不存在的静态方法时会被调用。
命名空间PHP的命名空间有一个前所未有的语法:复制代码如下:php//namespace的分隔符是反斜杠,声明语句必须在文件的第一行。//命名空间可以包含任意代码,但只有* *类、函数和常数* *受命名空间影响。命名空间XXOO \ Test
//这个类的完全限定名是\XXOO\Test\A,其中第一个反斜杠代表全局命名空间。A级{}
//还可以在现有文件中定义第二个命名空间,下面的代码都将位于\ other \ test 2 . namespace other \ test 2;
//实例化其他命名空间的对象:$ a=new \ XXOO \ Test \ AB类{}
//还可以用花括号定义第三个命名空间Namespace Other {//从子命名空间实例化对象:$ b=new Test2 \ B
//从其他命名空间导入名称并重命名。//注意只能导入类,不能导入函数和常量。使用\XXOO\Test\A as ClassA}关于命名空间语法的更多信息,请参考官网【注意】。命名空间通常与autoload一起使用,以自动加载类实现文件:
spl _ autoload _ register(function($ class){ spl _ autoload(str _ replace(' \ ','/',$ class));});当您实例化一个类\XXOO\Test\A时,该类的完全限定名将被传递给autoload函数,该函数将把类名中的名称空间分隔符(反斜杠)替换为斜杠,并包含相应的文件。这样,类定义文件可以分层存储,并根据需要自动加载。注:http://www.php.net/manual/zh/language.namespaces.php
后期静态绑定PHP的OPP机制,具有继承和类似虚函数的功能,比如下面的代码:复制代码如下:Class A { public func xxoo(){ print $ this-func xxoo();}
公共函数funcXXOO(){ return ' A:funcXXOO()';}}
B类扩展了一个{公共函数funcXXOO(){ return ' B:funcXXOO ';}}
$b=新B;$ b-callFuncXXOO();是:复制代码如下:B:funcXXOO。可以看出,在A中使用$this-funcXXOO()时,体现了“虚函数”的机制,实际调用的是B:funcXXOO()。但是如果把所有函数都改成静态函数:复制代码如下:A类{静态公共函数callfuncxxoo ()) }
静态公共函数func xxoo(){ return ' A:func xxoo()';}}
B类扩展了一个{静态公共函数funcXXOO(){ return ' B:funcXXOO ';}}
$b=新B;$ b-callFuncXXOO();情况不太乐观。输出是:复制代码如下:A:funcXXOO()。这是因为self的语义是“当前类”,所以PHP5.3给了static关键字一个新的函数:后期静态绑定:复制代码如下:class a { static public func xxoo(){ print static:func xxoo();}
//.}
//.这将按预期输出:复制代码code如下:B:funcXXOO
Heredoc 和 Nowdoc
PHP5.3对Heredoc和Nowdoc做了一些改进,这两个都是用来在PHP代码中嵌入大字符串的。Heredoc的行为类似于双引号字符串:复制代码如下:$ name=' MyName回显文本我的名字是“{$name}”。文本;Heredoc以三个左尖括号开始,后面是一个标识符(文本),直到它以一个相同的大写(不能缩进)的标识符结束。就像双引号字符串一样,变量可以嵌入其中。
Heredoc还可以用于函数参数和类成员初始化:复制代码如下:var _ dump(EODHello world EOD);
A级{ const xx=EODHello WorldEOD
public $ oo=EODHello WorldEOD}Nowdoc的行为类似于单引号字符串,其中不能嵌入变量。与Heredoc唯一不同的是,三个左尖括号后的标识符要用单引号括起来:复制代码如下:$ name=' MyNameecho 'TEXT '我的名字是“{ name }”。文本;输出:复制代码如下:我的名字是' {$name} '。
用 const 定义常量
从5.3开始,PHP支持使用const来定义全局名称空间和类中的常量。老样式:复制代码如下:define('XOOO ',' Value ');new style:const XXOO=' Value ';Const form只适用于常量,不适用于可以在运行时求值的表达式:复制代码如下://Correct const XXOO=1234;//错误常数XXOO=2 * 617
三元运算符简写形式旧样式:复制代码如下:echo $a?$a:“没有值”;可以缩写为:复制代码如下:echo $a?“没有价值”;也就是说,如果省略三元运算符的第二部分,默认情况下会被第一部分替换。
Phar
Phar,或者说PHP Archive,一开始只是Pear中的一个库,后来被改写成PHP5.3中的C扩展,内置到PHP中。Phar用于封装多个。php脚本(或其他文件)压缩成。phar(通常为ZIP格式)。目的是模仿Java的。罐子。不是,目的是让发布PHP应用更容易。同时还提供了数字签名验证等功能。的。phar文件可以像。php文件。同时,您也可以编写这样的代码来将代码包含在。phar:复制代码如下:require(' xxoo . phar ');require(' phar://xxoo . phar/XO/ox . PHP ');更多信息请参考官网【注】。注:http://www.php.net/manual/zh/phar.using.intro.php
PHP5.4(2012-2013)
Short Open Tag短开标签从PHP5.4开始就一直有了,这里我就重点说说PHP起止标签的问题。即复制代码如下:php//代码.通常是上面的形式,除此之外还有另一种简写形式:复制代码如下:/*代码.*/?也可以复制代码如下:php echo $ xxoo?简称:复制代码如下:=$ xxoo?这种速记形式被称为Short Open Tag,从PHP5.3开始默认开启,从PHP5.4开始一直可用,使用这种速记形式在HTML中嵌入PHP变量会非常方便。
对于纯PHP文件(比如类实现文件),PHP官方建议将开始标签写成大写,省略结束标签。这样就保证了整个PHP文件是没有任何输出的PHP代码,否则你在包含文件后设置Header和Cookie的时候会遇到一些麻烦【注意】。
注意:在输出任何内容之前,必须发送头和Cookie。
数组简写形式这个是很方便的功能!复制代码如下://原数组写$ arr=array ('key'=' value ',' key 2 '=' value 2 ');//缩写$ arr=['key'=' value ',' key 2 '=' value 2 '];
Traits所谓性状就是“成分”,是一种用来替代遗传的机制。PHP中不能执行多重继承,但是一个类可以包含多个特征。复制代码如下://Traits不能单独实例化,只能是traitsayworld { public function say hello(){ echo ' world!';}}
class hello world {//包含SayWorld中的成员;使用SayWorld}
$ xxoo=new myhello world();//sayHello()函数是SayWorld组件的$ xxoo-say hello();Traits还有很多神奇的功能,比如包含多个Traits,解决冲突,修改访问权限,为函数设置别名等等。性状也可以包含在性状中。篇幅有限,不能一一举例。详情请参考官网【注】。注:http://www.php.net/manual/zh/language.oop5.traits.php
内置 Web 服务器PHP从5.4开始内置轻量级Web服务器,不支持并发。它定位于开发和调试环境。在开发环境中使用确实很方便。复制代码如下:php -S localhost:8000。这样,在当前目录中建立了一个Web服务器,您可以通过http://localhost:8000/访问它。其中localhost是监听ip,8000是监听端口,可以自行修改。
很多应用中URL会被重写,所以PHP提供了一个设置路由脚本的功能:复制代码如下:PHP-s localhost:8000 index.php。这样,所有请求都将由index.php处理。您也可以使用XDebug来调试断点。
细节修改PHP5.4增加了动态访问静态方法的新方式:复制代码如下:$ func=' funcXXOOa:{ $ func }();添加实例化时访问类成员的特性:复制代码如下:(new my class)-xxoo();新支持函数返回数组的成员访问解析(这种写法在以前版本会给出错误):复制代码如下:print func()[0];
PHP5.5(2013起)
yieldyield关键字用于函数需要返回迭代器时,逐个返回值。复制代码如下:function number 10(){ for($ I=1;$ i=10$i=1)产生$ I;}该函数返回值为数组:复制代码如下:[1,2,3,4,5,6,7,8,9,10]list()用于foreach。可以使用list()解析foreach中的嵌套数组:复制代码如下:$ array=[[1,2,3],[4
foreach ($array as list($a,$b,$ c))echo ' { $ a } { $ b } { $ c } \ n ';结果:复制代码如下:1 2 34 5 6细节修改不推荐mysql函数,推荐PDO或MySQL。见上一篇文章。不再支持Windows XP。可以使用MyClass:class来获取类的完全限定名(包括命名空间)。Empty()支持将表达式作为参数。Try-catch结构添加了finally块。
PHP5.6
更好的常量定义常数时,允许使用之前定义的常数进行计算:复制代码如下:const A=2;const B=A 1;
C类{ const STR=' helloconst STR2=self:STR ',world ';}允许常量作为函数参数的默认值:复制代码如下:function func($arg=C:STR2)
更好的可变函数参数用于复制代码,而不是func_get_args()。代码如下:函数add(.$ args){ $ result=0;foreach($ args as $ arg)$ result=$ arg;返回$ result}同时可以在调用函数时将数组展开成函数参数:复制代码如下:$arr=[2,3];添加(1,$ arr);//结果是6命名空间命名空间支持常量和函数:复制代码如下:命名空间name \ space { constfoo=42函数f() { echo __FUNCTION__。\ n ';}}
命名空间{ use const Name \ Space \ FOO使用函数名\ Space \ f;
回声FOO。\ n ';f();}
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。