7.0 新特性
1:标量类型声明【7.0】
标量类型声明有两种模式:强制(默认)和严格模型,现在可以使用下列类型参数(无论是强制模式还是严格模式):字符串(string),整数(int),浮点数(float)以及布尔值(bool)。它们扩充了PHP5中引入的其他类型:类名,接口,数组和回调类型。
<?php // Coercive mode function sumOfInts(int ...$ints) { return array_sum($ints); } var_dump(sumOfInts(2, '3', 4.1));
输出结果:
int(9)
要使用严格模式,一个declare声明指令必须放在文件的顶部,这意味着严格声明标量是基于文件可配的。这个指令不仅影响参数的类型声明,也影响到函数的返回值声明。
<?php // Coercive mode declare(strict_types=1); function sumOfInts(int ...$ints) { return array_sum($ints); } var_dump(sumOfInts(2, '3', 4.1));
输出结果:
Fatal error: Uncaught TypeError: Argument 2 passed to sumOfInts() must be of the type integer, string given….
2:返回值类型声明【7.0】
PHP7增加了对返回类型的声明,类似于参数类型声明。
<?php function arraysSum(array ...$arrays): array { return array_map(function (array $array): int { return array_sum($array); }, $arrays); } print_r(arraysSum([1, 2, 3], [4, 5, 6], [7, 8, 9]));
输出结果
Array ( [0] => 6 [1] => 15 [2] => 24 )
假如我定义返回类型是array,实际返回是string,来看下报错提示
<?php function arraysSum(array ...$arrays): array { $number = 0; foreach ($arrays as $value) { $number += array_sum($value); } return $number; } print_r(arraysSum([1, 2, 3], [4, 5, 6], [7, 8, 9]));
输出结果:
Fatal error: Uncaught TypeError: Return value of arraysSum() must be of the type array, integer returned ….
3:null合并运算符【7.0】
由于日常使用中存在大量使用三元表达式和isset的情况,那么我们可以使用null合并运算符(??)这个语法糖。如果变量存在且值不为null,它就会返回自身的值,否则返回它的第二个操作数。
链接:http://127.0.0.1/demo.php?user_name=zhangsan
<?php $userName = isset($_GET['user_name']) ? $_GET['user_name'] : "nobody"; echo $userName;
输出结果:
zhangsan
我们用null合并运算符来改一下这个代码
<?php $userName = $_GET['user_name'] ?? "nobody"; echo $userName;
输出结果
zhangsan
4:太空操作符【7.0】
太空船操作符用于比较两个表达式。当$a小于、等于或大于$b时它分别返回-1、0或1。
<?php
// 整数
echo 1 <=> 1; // 0
echo 1 <=> 2; // -1
echo 2 <=> 1; // 1
// 浮点数
echo 1.5 <=> 1.5; // 0
echo 1.5 <=> 2.5; // -1
echo 2.5 <=> 1.5; // 1
// 字符串
echo "a" <=> "a"; // 0
echo "a" <=> "b"; // -1
echo "b" <=> "a"; // 1
5:通过define()定义常量数组【7.0】
Array类型的常量可以通过define来定义,在PHP5.6中仅能通过const定义
<?php const ANIMALS = array('dog', 'cat', 'bird'); echo ANIMALS[1] . PHP_EOL; // 将输出 "cat" // 常量数组 define('ANIMALS', array( 'dog', 'cat', 'bird' )); echo ANIMALS[1] . PHP_EOL; // 将输出 "cat"
输出结果:
cat cat
个人感觉,这个特性用处不大。
6:匿名类【7.0】
现在支持通过new class
来实例化一个匿名类,主要用来创建一次性的简单对象,也解决了类命名的问题。每次创建一个新类,都要想着起什么名字好,匿名类解决了这个问题。
<?php
// 使用显性类
class Logger
{
public function log($msg)
{
echo $msg;
}
}
$util->setLogger(new Logger());
// 使用匿名类
$util->setLogger(new class {
public function log($msg)
{
echo $msg;
}
});
详细文档请参考:https://www.php.net/manual/zh/language.oop5.anonymous.php
7:整数除法函数 intdiv()【7.0】
新加的函数 intdiv() 用来进行 整数的除法运算。
<?php var_dump(intdiv(10, 3)); //以前的方法 var_dump((int)(10 / 3));
输出结果:
int(3) int(3)
7.1 新特性
1:可为空(Nullable)类型【7.1】
参数以及返回值的类型现在可以通过在类型前加上一个问号使之允许为空。
当启用这个特性时,传入的参数或者函数返回的结果要么是给定的类型,要么是 null 。
<?php
function testReturn(): ?string
{
return 'elePHPant';
}
var_dump(testReturn());
输出结果:
string(9) “elePHPant”
<?php function testReturn(): ?string { return null; } var_dump(testReturn());
输出结果:
NULL
<?php function testReturn(?string $name) { return $name; } var_dump(testReturn('elePHPant'));
输出结果:
string(9) “elePHPant”
<?php
function testReturn(?string $name)
{
return $name;
}
var_dump(testReturn(null));
输出结果:
NULL
2:void 函数【7.1】
一个新的返回值类型void被引入。 返回值声明为 void 类型的方法要么干脆省去 return 语句,要么使用一个空的 return 语句。 对于 void 函数来说,null
不是一个合法的返回值。
<?php
function test(): void
{
return;
}
$result = test();
var_dump($result);
输出结果:
NULL
试图去获取一个 void 方法的返回值会得到 null
,并且不会产生任何警告。这么做的原因是不想影响更高层次的方法。
3:多异常捕获处理【7.1】
一个catch语句块现在可以通过管道字符(|
)来实现多个异常的捕获。 这对于需要同时处理来自不同类的不同异常时很有用。
<?php
try {
// some code
} catch (FirstException|SecondException $e) {
// handle first and second exceptions
}
7.2 新特性
1:新的对象类型【7.2】
这种新的对象类型, object, 引进了可用于逆变(contravariant)参数输入和协变(covariant)返回任何对象类型。
<?php
class Student
{
}
class Teacher
{
}
function test(object $obj): object
{
return new $obj();
}
$student = test(new Student());
var_dump($student);
$teacher = test(new Teacher());
var_dump($teacher);
输出结果:
object(Student)#2 (0) {
}
object(Teacher)#3 (0) {
}
7.4 新特性
1:属性添加限定类型 【7.4】
类的属性中现在支持添加指定的类型
<?php
class User
{
public int $id;
public string $name;
}
$user = new User();
$user->id = 'zhangsan';
echo "<pre/>";
print_r($user);
输出结果:
Fatal error: Uncaught TypeError: Typed property User::$id must be int, string used …..
上面的例子中,会强制要求 $user->id
只能为 int 类型,同时 $user->name
只能为 string 类型。
2:箭头函数【7.4】
<?php
$factor = 10;
$nums = array_map(fn($n) => $n * $factor, [1, 2, 3, 4]);
var_dump($nums);
输出结果:
array(4) { [0]=> int(10) [1]=> int(20) [2]=> int(30) [3]=> int(40) }
3:数组展开操作【7.4】
<?php
$parts = ['apple', 'pear'];
$fruits = ['banana', 'orange', ...$parts, 'watermelon'];