1 、标量类型声明
有两种模式 : 强制 ( 默认 ) 和 严格模式。 现在可以使用下列类型参数(无论用强制模式还是严格模式): 字符串 (string), 整数 (int), 浮点数 (float), 以及布尔值 (bool) 。它们扩充了 PHP5 中引入的其他类型:类名,接口,数组和 回调类型。在旧版中,函数的参数申明只能是 (Array $arr) 、 (CLassName $obj) 等,基本类型比如 Int ,String 等是不能够被申明的
<?php
function check(int $bool){
var_dump($bool);
}
check(1);
check(true);
?>
若无强制类型转换,会输入 int(1)bool(true) 。转换后会输出 bool(true) bool(true)
2 、返回值类型声明
PHP 7 增加了对返回类型声明的支持。返回类型声明指明了函数返回值的类型。可用的类型与参数声明中可用的类型相同。
<?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
)
3 、 null 合并运算符
项目中存在大量同时使用三元表达式和 isset() 的情况,新增了 null 合并运算符 (??)这个语法糖。如果变量存在且值不为 NULL , 它就会返回自身的值,否则返回它的第二个操作数。
旧版: isset($_GET[‘id']) ? $_GET[id] : err;
新版: $_GET['id'] ?? 'err';
4 、太空船操作符(组合比较符)
太空船操作符用于比较两个表达式。当 $a 大于、等于或小于 $b 时它分别返回 -1 、0 或 1 。 比较的原则是沿用 PHP 的常规比较规则进行的。
<?php
// Integers
echo 1 <=> 1; // 0
echo 1 <=> 2; // -1
echo 2 <=> 1; // 1
// Floats
echo 1.5 <=> 1.5; // 0
echo 1.5 <=> 2.5; // -1
echo 2.5 <=> 1.5; // 1
// Strings
echo "a" <=> "a"; // 0
echo "a" <=> "b"; // -1
echo "b" <=> "a"; // 1
?>
5 、通过 define() 定义常量数组
<?php
define('ANIMALS', ['dog', 'cat', 'bird']);
echo ANIMALS[1]; // outputs "cat"
?>
6 、匿名类
现在支持通过 new class 来实例化一个匿名类,这可以用来替代一些“用后即焚”的完整类定义。
<?php
interface Logger {
public function log(string $msg);
}
class Application {
private $logger;
public function getLogger(): Logger {
return $this->logger;
}
public function setLogger(Logger $logger) {
$this->logger = $logger;
}
}
$app = new Application;
$app->setLogger(new class implements Logger {
public function log(string $msg) {
echo $msg;
}
});
var_dump($app->getLogger());
7. use 批量声明
PHP 7 中 use 可以在一句话中声明多个类或函数或 const 了:
- <php
- use 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 * 的方法)。
需要留意的问题是:如果你使用的是基于 composer 和 PSR-4 的框架,这种写法是否能成功的加载类文件?其实是可以的,composer 注册的自动加载方法是在类被调用的时候根据类的命名空间去查找位置,这种写法对其没有影响。