$a = $_GET["a"] ?? 1;它相当于:
<?php$a = isset($_GET["a"]) ? $_GET["a"] : 1;我们知道三元运算符是可以这样用的:
$a ?: 1

2. 函数返回值类型声明
官方文档提供的例子(注意 … 的边长参数语法在 PHP 5.6 以上的版本中才有):
<?phpfunction 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]));从这个例子中可以看出现在函数(包括匿名函数)都可以指定返回值的类型。func sayHello(personName: String) -> String {let greeting = "Hello, " + personName + "!"return greeting}这个特性可以帮助我们避免一些 PHP 的隐式类型转换带来的问题。在定义一个函数之前就想好预期的结果可以避免一些不必要的错误。<?phpfunction foo($a) : int{return $a;}foo(1.0);以上代码可以正常执行,foo 函数返回 int 1,没有任何错误。<?phpdeclare(strict_types=1);function foo($a) : int{return $a;}foo(1.0);# PHP Fatal error: Uncaught TypeError: Return value of foo() must be of the type integer, float returned in test.php:6<?php// Coercive modefunction sumOfInts(int ...$ints){return array_sum($ints);}var_dump(sumOfInts(2, "3", 4.1));需要注意的是上文提到的严格模式的问题在这里同样适用:强制模式(默认,既强制类型转换)下还是会对不符合预期的参数进行强制类型转换,严格模式下则触发 TypeError 的致命错误。<?phpuse some/namespace/{ClassA, ClassB, ClassC as C};use function some/namespace/{fn_a, fn_b, fn_c};use const some/namespace/{ConstA, ConstB, ConstC};但还是要写出每个类或函数或 const 的名称(并没有像 python 一样的 from some import * 的方法)。