【注意】最后更新于 November 4, 2020,文中内容可能已过时,请谨慎使用。
PHP8.0
目前php8.0
还在测试阶段.正式版大概12月份出来.先来看一下新版本的改进或新特性.
1. 更方便的获取类名
之前的版本
1
2
3
4
5
6
7
8
|
class User {
}
$className = User::class;
// or
$user = new User();
get_class($user);
|
新版本
1
2
3
4
5
|
class User {
}
$user = new User();
$className = $user::class;
|
2. 新增字符串函数
对于字符串的一些操作.
之前的版本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
// 1. 字符串中是否包含某个字符串
$str = 'Hello world!';
if (strpos($str,"world") !== false){
echo "Found";
}
// 2. 字符串是否以某个字符串开头
$found = 'Hello';
if (substr($str,0,count($found)) == $found){
echo 'Yes';
}
// 3. 字符串是否以某个字符串结尾
if (substr($str,-count($found),count($found)) == $found){
echo 'Yes';
}
|
新版本
1
2
3
4
5
6
7
8
9
10
11
12
13
|
// 1. 字符串中是否包含某个字符串
$str = 'Hello world!';
if (str_contains($str,"world")){
echo 'Found';
}
// 2. 字符串是否以某个字符串开头
if (str_starts_with($str,"Hello")){
echo 'Yes';
}
// 3. 字符串是否以某个字符串结尾
if (str_end_with($str,'Hello')){
echo 'Yes';
}
|
对比: 新版本会更加方便.更加语义化.表达的意思更加清晰.
3. 构造方便更精简
旧版本
1
2
3
4
5
6
7
8
|
class User{
public $name;
public function __construct($name){
$this->name = $name;
}
}
$user = new User("lisa");
$user->name;
|
新版本
1
2
3
4
5
6
7
|
class User{
public function __construct(public $name){
}
}
$user = new User("lisa");
$user->name;
|
4. 箭头函数支持异常捕捉
旧版本
1
2
3
4
|
$fn = fn() => 'ABC';
$fn();
$ex = fn() => throw new Exception(); // error
|
新版本
1
2
3
4
5
6
7
8
9
10
|
$fn = fn() => 'ABC';
$fn();
$ex = fn() => throw new Exception();
try{
$ex();
}catch(Exception){
echo 'Failed';
}
|
对比: 修复了箭头函数对异常的处理.并且可以去点捕捉异常时的参数名 $exception(如果没有用到这个变量)
5. null 空值安全检查
旧版本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
class User{
public function __construct(public $name){
}
}
class Auth {
public function user(){
return new User('lisa');
}
}
$auth = new Auth();
$auth->user()->name; // error
// if new User return null;
if($auth->user()){
$auth->user()->name; // ok
}
// or
$auth->user()?$auth->user()->name:null; //ok
|
新版本
1
2
3
4
5
6
7
8
9
10
11
12
13
|
class User{
public function __construct(public $name){
}
}
class Auth {
public function user(){
return new User('lisa');
}
}
$auth = new Auth();
$auth->user()?->name;
|
6. 联合数据类型-支持联合类型
旧版
1
2
3
4
5
6
7
8
9
10
11
|
class TV{
}
class PC{
}
function fix(TV $it){
echo 'I fix it'
}
fix(new Tx); // ok
fix(new PC); // error
|
新版
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
class TV{
}
class PC{
}
function fix(TV|PC $it){
echo 'I fix it'
}
fix(new Tx); // ok
fix(new PC); // ok
// 关于返回值
function fix(TV|PC $it) : string| int {
// return string or int is ok
}
// mixed 类型代表了包括null 空的所有类型.只能单独使用
function fix(TV|PC $it) :mixed {
// you can return all type
}
// ok method ? 表示可以返回指定的值和null
function fix(TV|PC $it) ?:stirng {
// you can return string or null
}
// error method
function fix(TV|PC $it) ?:mixed {
// you can return all type
}
|
7. match 表达式进行逻辑判断 – 简化 switch
以前的版本
1
2
3
4
5
6
7
8
9
10
11
|
$name = 'd';
switch ($name) {
case 'a':
//
break;
case 'b':
case 'c':
// 省略break则跟下个处理逻辑相同
break;
default:
}
|
新版本
1
2
3
4
5
6
|
$name = 'd';
match($name){
'a' => 'A',
'b','c','d' => 'B',
default => 'Not Found'
}
|
8. 函数参数命名传递 – 传递参数更随意.不在意默认值跟参数顺序
旧版本
1
2
3
4
|
function method($who,$when=now(),$do){
echo "$who $do at $when";
}
method('lisa',null,'Eat breakfast')
|
新版本
1
2
3
4
5
6
7
|
function method($who,$when=now(),$do){
echo "$who $do at $when";
}
method(
who : 'lisa',
do : 'Eat breakfast'
)
|
**对比: ** 使用键值对的方式对应参数,可以忽略有默认值的参数和参数的顺序.更加简洁.