PHP7 的部分新特性
PHP 7.0
http://php.net/manual/zh/migration70.new-features.php
参数类型声明
function sumOfInts(int ...$ints)
{
    return array_sum($ints);
}
函数到参数可以强制定义为以下类型:
- string
- int
- float
- bool
在 PHP5 中可使用:
- class
- array
- interface
- callable
返回值类型声明
function arraysSum(array ...$arrays): array
{
    return array_map(function(array $array): int {
        return array_sum($array);
    }, $arrays);
}
null 运算符
解决了三元运算符+isset()的麻烦
//下面两个语句有同等效果
$username = $_GET['user'] ?? 'nobody';
$username = isset($_GET['user']) ? $_GET['user'] : 'nobody';
//还可以使用多个??来向后匹配
$username = $_GET['user'] ?? $_POST['user'] ?? 'nobody';
组合比较符
<=> 用于比较两个表达式,当左边分别小于、等于、大于时分别返回-1,0,1
// 整数
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
define() 定义常量数组
在 PHP 5.6 中仅可使用 const
define('ANIMALS', [
    'dog',
    'cat',
    'bird'
]);
匿名类
用于临时构建类
new class{
    $foo="bar";
}
组合 use
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};
PHP 7.1
https://secure.php.net/manual/zh/migration71.new-features.php
可为空类型
在参数和返回值指定类型前加上 ? 表明可为 null
function testReturn(): ?string
{
    return null;
}
function test(?string $name)
{
    var_dump($name);
}
void 函数
使用 void 函数时,函数内部要么不出现 return,要么只使用 return;
function swap(&$left, &$right) : void
{
    if ($left === $right) {
        return;
    }
    $tmp = $left;
    $left = $right;
    $right = $tmp;
}
为常量设置访问控制
class ConstDemo
{
    const PUBLIC_CONST_A = 1;
    public const PUBLIC_CONST_B = 2;
    protected const PROTECTED_CONST = 3;
    private const PRIVATE_CONST = 4;
}
负数的字符串偏移量
数组下标还不能指定为负数
var_dump("abcdef"[-2]);
var_dump(strpos("aabbcc", "b", -3));
//string (1) "e"
//int(3)
PHP 7.2
https://secure.php.net/manual/zh/migration72.new-features.php
object 类型
function test(object $obj) : object
{
    return new SplQueue();
}
test(new StdClass());
抽象方法的重写
一个抽象类继承另一个抽象类时,子抽象类可以重写父抽象类中的方法
abstract class A
{
    abstract function test(string $s);
}
abstract class B extends A
{
    // overridden
    abstract function test($s) : int;
}
Argon2 算法生成密码 hash
Argon2 算法被认为是优于目前默认密码 hash 算法 bcrypt
password_hash('rasmuslerdorf', PASSWORD_ARGON2I);
允许命名空间分组末尾使用逗号
use Foo\Bar\{
    Foo,
    Bar,
    Baz,
};