[doc]
一、PHP 7 新特性
1.1标量类型声明
标量类型声明有两种模式: 强制 (默认) 和 严格模式
强制模式:非标量类型自动转换
严格模式:非标量类型报错,declear(strict_types=1);
//需要放在首行
function sum (int ...$ints)
{
return array_sum($ints);
}
var_dump(sum([2,'3.1',4]));#9,如果是严格模式,将会报错
1.2 返回值类型声明
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
)
1.3 null 合并运算符
由于日常使用中存在大量同时使用三元表达式和
isset()
的情况, 我们添加了 null 合并运算符 (??
) 这个语法糖。如果变量存在且值不为null
, 它就会返回自身的值,否则返回它的第二个操作数。
$username ?? 'nobody';
1.4 <=> 太空船操作符
// 整数
echo 1 <=> 1; // 0
echo 1 <=> 5; // -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
1.5 定义常量数组
define('ANIMALS', ['dog', 'cat','bird']);
echo ANIMALS[1];
1.6 整数除法函数
var_dump(intdiv(10, 3));#3
二、 PHP7.1
2.1 可为空(Nullable)类型
参数以及返回值的类型现在可以通过在类型前加上一个问号使之允许为空。 当启用这个特性时,传入的参数或者函数返回的结果要么是给定的类型,要么是 null 。
function testReturn(): ?string
{
return null;
}
var_dump(testReturn());#NULL
function test(?string $name)
{
return $name;
}
var_dump(test(null));#NULL
2.2 类常量可见性
class className{
const PUBLIC_CONST_A = 1;
public const PUBLIC_CONST_B = 2;
}
var_dump(className::PUBLIC_CONST_A );#1
var_dump(className::PUBLIC_CONST_B);#2
2.3 list替代短语
$data = [
[1,'tom'],
[2,'jenry']
];
[$id,$name] = $data[1];#2
var_dump($id);#jenry
var_dump($name);
foreach ($data as [$id,$name]) {
var_dump($id);#1
var_dump($name);#tom
die;
}
2.4 list支持键名
list("id" => $id1, "name" => $name1) = ['id'=>1,'name'=>'tom'];
var_dump($name1);#tim
2.5 支持为负数的字符串偏移量
现在所有支持偏移量的字符串操作函数都支持接受负数作为偏移量,包括通过
[]
或{}
操作字符串下标。在这种情况下,一个负数的偏移量会被理解为一个从字符串结尾开始的偏移量。
var_dump("abcdef"[-2]);#e
var_dump(strpos("aabbcc", "b", -3));#3
$string = 'bar';
echo "The last character of '$string' is '$string[-1]'.\n";#The last character of 'bar' is 'r'.
三、 PHP7.2
3.1 允许重写抽象方法(Abstract method)
当一个抽象类继承于另外一个抽象类的时候,继承后的抽象类可以重写被继承的抽象类的抽象方法。
abstract class A
{
abstract function test(string $s);
}·
abstract class B extends A
{
abstract function test($s) : int;
}
PHP7.4
4.1 属性添加限定类型
class User {
public int $id;
public string $name;
}
4.2 箭头函数 提供了一种更简洁的定义函数的方法。
$factor = 10;
$nums = array_map(fn($n) => $n * $factor, [1, 2, 3, 4]);
// $nums = array(10, 20, 30, 40);
4.3 空合并运算符赋值
$array = ['b'=>2];
$array['key']??=1;
var_dump($array);#array(2) { ["b"]=> int(2) ["key"]=> int(1) }
4.4 数组展开操作
$parts = ['apple', 'pear'];
$fruits = ['banana', 'orange', ...$parts, 'watermelon'];
// ['banana', 'orange', 'apple', 'pear', 'watermelon'];