PHP新特性
PHP5.5新特性
字符串直接表达式
直接通过中括号获取字符串中的单个字符。
$string = 'hello world';
echo $string[1];
#输出: e
foreach和list()
foreach 循环语句中支持list函数
$data = [
[1,'标题1','内容1'],
[2,'标题2','内容2'],
[3,'标题3','内容3'],
];
foreach($data as list($id,$title,$content)){
echo $id.'|'.$title.'|'.$content."\r\n";
}
#输出:
1|标题1|内容1
2|标题2|内容2
3|标题3|内容3
生成器( Generator )
Generator 是PHP5.5以后,提供的一个新的特性。函数的返回值是对象,可迭代的对象。
生成器的使用关键是 yield关键词,这个yield可以理解为 函数里面的return,只不过return只能返回一次,而yield可以不断返回,可以返回多次。
在处理大数据时时非常有用的方法,下面是一个简单的使用例子:
function gen(){
yield 1;
yield 2;
yield 3;
}
#返回的是一个可迭代对象,操作时使用循环
var_dump(gen()); //结果:object(Generator)#1 (0) {}
foreach(gen() as $i){
echo $i."\r\n";
}
#结果:
1
2
3
PHP5.6新特性
使用'**'来完成 数值的幂运算
echo 2**3; //8
echo 2**4; //16
使用表达式定义常量、类属性、函数参数默认值
const NUM1 = 1;
const NUM2= 1 + NUM1;
echo NUM2; //2
function sum($a,$b = NUM1 + 1){
echo $a + $b;
}
echo sum(1); //3
函数参数列表支持接收可变数量参数
函数的参数允许接收多个,而不需要提前声明形参。
function foo($a, ...$b){
echo $a;
echo $b[0];
echo $b[1];
}
foo(1,2,3); //输出:1 2 3
function bar($a, $b){
echo $a;
echo $b;
}
bar(...[1,2]); //输出: 1 2
命名空间支持导入常量和函数
使用列子:
namespace App\Article;
class foo{}
class bar{}
const CC = '常量CC';
function func(){
echo 'func';
}
namespace Foo;
use App\Article\foo;
use App\Article\CC;
use App\Article\func;
PHP7.0新特性
新增运算符
# null合并运算符
echo $_GET['id'] ?? : 1;
//php7.0以前的写法:
echo $_GET['id'] ?? $_GET['id'] : 1;
# 飞船运算符<=>
#结果有三种,0表示两边的值相等,1表示左边的值大于右边的值,-1表示左边的值小于右边的值
echo 1 <=> 1; //0
echo 2 <=> 1; //1
echo 1 <=> 2; //-1
数组常量
数组可以定义为常量
define('LIST',[1,2,3,4]);
echo LIST[0];
#在现在的PHP开发中,一般常量使用const来定义,原因是const定义的常量受命名空间的限制,而define不受限制
除法取整商
新增了 intdiv,可以获取商的整数部分。
echo 10/3; //3.3333333333333
echo intdiv(10,3); //3
echo intdiv(1,3); //0
命名空间成员批量导入
namespace App\Article;
class foo{}
class bar{}
const CC = '常量CC';
const BB = '常量BB';
function func1(){
echo 'func1';
}
function func2(){
echo 'func2';
}
namespace Foo;
use App\Article\(foo,bar);
use App\Article\(CC1,CC2);
use App\Article\(func1,func2);
session_start()中动态设置项覆盖配置文件配置
php7以前,session的相关配置只能在php.ini中修改,这样的修改需要重启服务器才能生效,而且只能整个环境一改全改,没办法做到单个项目中的session定制。在php7就可以根据各自项目,针对项目来定制session的配置了:
session_start([
'save_path' => 'E:/', //session存储地址
'name' => 'PHP666' //cookie里面的session名称
]);
IntlChar类
IntlChar类提供了很多操作unicode字符的方法给我们,下面列举几个:
echo IntlChar::ord('A'); //返回字符的ascii码
echo IntlChar::tolower('A'); //返回字符的小写格式
echo IntlChar::toupper('A'); //返回字符的大写格式
echo IntlChar::isspace(' '); //判断是否空白字符
类型严格模式
PHP7.0以后,PHP对于函数的参数和返回值,变量类型的限定,这样可以保证我们函数代码安全,代码提升的执行效率。
早在5.0,PHP就已经支持在函数的参数中限定的类名和接口名,
在PHP7.0以后,PHP进一步支持了函数的参数和返回值可以限定为 标量类型【布尔值,浮点型,整型和字符串】
| 类型 | 说明 | PHP版本 |
|---|---|---|
| 类名/接口名 | 5.0.0 | |
| array | 数组类型 | 5.1.0 |
| callable | 回调类型:匿名函数,闭包函数,实现了_invoke()的类 | 5.4.0 |
| bool | true,false | 7.0.0 |
| float | 浮点型 | 7.0.0 |
| int | 整形 | 7.0.0 |
| string | 字符型 | 7.0.0 |
使用例子:
declare(strict_types=1); //可以通过在代码前面声明上面这句代码,可以告诉PHP必须严格遵守类型限制
function foo (int $a):int{
return $a;
}
匿名类
PHP5.3以后支持了匿名函数,在PHP7.0也支持匿名类的使用,和匿名函数,一般临时调用/一次性的功能,我们可以使用匿名函数完成。同样,匿名类是用于在开发时,一些临时需要使用的对象或一次性的对象,就可以使用匿名类来创建。
$obj = new class{
function bar(){
echo 'hello';
}
};
$obj->bar(); //hello
unserialize限定类
unserialize 反序列,在PHP7.0以前,都存在一个非常危险的漏洞。这个漏洞就是在早期的PHP版本中, 如果使用unserialize反序列对象时,对象自动触发析构函数。如果恶意代码不小心被执行了,将造成不可预料的结果,PHP7为了解决这个漏洞,给unserialize提供了第二个参数,用于限定反序列的类。使用方法:
$obj = unserialize('O:5:"Humen":0:{}',['allowed_classes' => []]);
生成器支持返回值和委托
在PHP7.0以后,生成器函数支持return 关键词,返回最终结果,这种特性可以用来完成生成器执行结束以后的收尾工作,例如关闭连接,记录日志等。
function gen(){
yield 1;
yield 2;
yield 3;
return 4;//执行收尾操作
}
生成器之间可以互相调用
使用yield form xxx 调用,可以使我们把一些复杂的功能,分成成多个功能。
function gen1(){
yield 'gen1()第一次生成数据';
yield from gen2();
yield 'gen2()第二次生成数据';
yield from gen3();
}
function gen2(){
yield 'gen2()第一次生成数据';
}
function gen3(){
yield 'gen3()第一次生成数据';
}
$gen = gen1();
foreach($gen as $item){
echo $item . "\r\n";
}
结果:
gen1()第一次生成数据
gen2()第一次生成数据
gen2()第二次生成数据
gen3()第一次生成数据
PHP7.1新特性
通过负数下标获取字符串末尾的字符,但是遗憾的是,目前还不支持数组的负数下标
$string = 'hello world';
echo $string[-1]; //d
echo $string[-2]; //l
中括号来代替list函数,通过list函数支持分解关联数组
$arr = [1, 2, 3]
[$a,$b,$c] = $arr;
var_dump($a,$b,$c); //1 2 3
$data = [
['id'=>1,'title'=>'标题1','content'=>'内容1'],
['id'=>2,'title'=>'标题2','content'=>'内容2'],
['id'=>3,'title'=>'标题3','content'=>'内容3'],
];
//lsit 分解关联数组
foreach($data as list('id'=>$id,'title'=>$title,'content'=>$content)){
var_dump($id,$title,$content);
}
#输出:
int(1)
string(7) "标题1"
string(7) "内容1"
int(2)
string(7) "标题2"
string(7) "内容2"
int(3)
string(7) "标题3"
string(7) "内容3"
类型严格模式增加可空类型
function foo (?int $a):?int{
return null;
}
void返回值
用于设置一些不允许有返回值的函数中, 强制规定,不能出现返回值
function foo (int $a):void{
//无返回值
}