PHP新特性

2019-08-13  本文已影响0人  simpleX

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{
   //无返回值
}
上一篇 下一篇

猜你喜欢

热点阅读