PHP7 版本各大类型特性

php5.6 升级 php7.0 支持的特性

标量类型声明

标量类型声明 有两种模式: 强制 (默认) 和 严格模式。

function sumOfInts(int ...$ints)
{
    return array_sum($ints);
}

var_dump(sumOfInts(2, '3', 4.1));

黑白课堂
php5.6不支持的。

强制类型支持如下类型

  • Class/interface name 该参数必须是instanceof给定的类或接口名称。 PHP 5.0.0
  • self 参数必须instanceof与定义方法的类别相同。这只能用于类和实例方法。 PHP 5.0.0+
  • array 参数必须是一个数组。 PHP 5.1.0+
  • callable 该参数必须是有效的callable。 PHP 5.4.0+
  • bool 该参数必须是布尔值。 PHP 7.0.0+
  • float 该参数必须是浮点数。 PHP 7.0.0+
  • int 参数必须是整数。PHP 7.0.0+
  • string 参数必须是字符串。PHP 7.0.0+
  • iterable 参数必须是数组或Traversable。 instanceof, PHP 7.1.0+
  • object ,参数必须是一个对象。PHP 7.2.0+

例子

class C {}
class D extends C {}

// This doesn't extend C.
class E {}

function f(C $c) {
    echo get_class($c)."\n";
}

f(new C);
f(new D);
f(new E);

黑白课堂

严格输入例子

declare(strict_types=1);

function sum(int $a, int $b) {
    return $a + $b;
}

var_dump(sum(1, 2));
var_dump(sum(1.5, 2.5));

黑白课堂

弱格式输入

function sum(int $a, int $b) {
    return $a + $b;
}

var_dump(sum(1, 2));
var_dump(sum(1.5, 2.5));

黑白课堂

捕获TypeError

declare(strict_types=1);

function sum(int $a, int $b) {
    return $a + $b;
}

try {
    var_dump(sum(1, 2));
    var_dump(sum(1.5, 2.5));
} catch (TypeError $e) {
    echo 'Error: '.$e->getMessage();
}

null合并运算符

如果变量存在且值不为NULL, 它就会返回自身的值,否则返回它的第二个操作数.

$username = $_GET['user'] ?? 'nobody';
echo $username;

黑白课堂

通过 define() 定义常量数组

<?php
define('ANIMALS', [
    'dog',
    'cat',
    'bird'
]);

echo ANIMALS[1]; // 输出 "cat"

黑白课堂

匿名类 new class

现在支持通过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());
?>

黑白课堂

从同一 namespace 导入的类、函数和常量现在可以通过单个 use 语句 一次性导入了

// PHP 7 之前的代码
use some\namespace\ClassA;
use some\namespace\ClassB;
use some\namespace\ClassC as C;

use function some\namespace\fn_a;
use function some\namespace\fn_b;
use function some\namespace\fn_c;

use const some\namespace\ConstA;
use const some\namespace\ConstB;
use const some\namespace\ConstC;

// PHP 7+ 及更高版本的代码
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};

有点类似 js 的引入模块写法。

intdiv() 整数除法函数

<?php

var_dump(intdiv(10, 3));//int(3)

?>

random_bytes 生成加密安全的伪随机字节

random_bytes ( int $length ) : string

$bytes = random_bytes(16);
echo (bin2hex($bytes));

黑白课堂

random_int() 生成加密安全的伪随机整数

var_dump(random_int(100, 999));
var_dump(random_int(-1000, 0));

黑白课堂

PHP7.0 升级到php7.1特性

可为空(Nullable)类型

<?php

function testReturn(): ?string
{
    return 'elePHPant';
}

var_dump(testReturn());

function testReturn(): ?string
{
    return null;
}

var_dump(testReturn());

function test(?string $name)
{
    var_dump($name);
}

test('elePHPant');
test(null);
test();

void函数

function swap(&$left, &$right) : void
{
    if ($left === $right) {
        return;
    }

    $tmp = $left;
    $left = $right;
    $right = $tmp;
}

$a=10;
$b=20;

var_dump(swap($a,$b)) ;

黑白课堂

短数组语法([])现在作为list()语法的一个备选项,可以用于将数组的值赋给一些变量


$data = [
    [1, 'Tom'],
    [2, 'Fred'],
];

// list() style
echo 'list($id1, $name1) = $data[0];<br/>';
list($id1, $name1) = $data[0];

echo $id1,'-----',$name1,'<br/>';

// [] style
[$id1, $name1] = $data[0];

echo '[$id1, $name1] = $data[0];<br/>';

echo $id1,'-----',$name1,'<br/>';

黑白课堂

类常量可见性

<?php
class ConstDemo
{
    const PUBLIC_CONST_A = 1;
    public const PUBLIC_CONST_B = 2;
    protected const PROTECTED_CONST = 3;
    private const PRIVATE_CONST = 4;
}

iterable 伪类

<?php
function iterator(iterable $iter)
{
    foreach ($iter as $val) {
        //
    }
}

多异常捕获处理

一个catch语句块现在可以通过管道字符(|)来实现多个异常的捕获。 这对于需要同时处理来自不同类的不同异常时很有用

<?php
try {
    // some code
} catch (FirstException | SecondException $e) {
    // handle first and second exceptions
}

list()现在支持键名

<?php
$data = [
    ["id" => 1, "name" => 'Tom'],
    ["id" => 2, "name" => 'Fred'],
];

// list() style
list("id" => $id1, "name" => $name1) = $data[0];

// [] style
["id" => $id1, "name" => $name1] = $data[0];

支持为负的字符串偏移量

var_dump("abcdef"[-2]); //string (1) "e"

openssl_encrypt /openssl_decrypt 支持 AEAD

异步信号处理

一个新的名为 pcntl_async_signals() 的方法现在被引入, 用于启用无需 ticks (这会带来很多额外的开销)的异步信号处理

<?php
pcntl_async_signals(true); // turn on async signals

pcntl_signal(SIGHUP,  function($sig) {
    echo "SIGHUP\n";
});

posix_kill(posix_getpid(), SIGHUP);//SIGHUP

ext/mcrypt 废弃

PHP7.1 升级到php7.2

新的对象类型

<?php

function test(object $obj) : object
{
    return new SplQueue();
}

test(new StdClass());

通过名称加载扩展

扩展文件不再需要通过文件加载 (Unix下以.so为文件扩展名,在Windows下以 .dll 为文件扩展名) 进行指定。可以在php.ini配置文件进行启用, 也可以使用 dl() 函数进行启用。

允许重写抽象方法(Abstract method)

<?php

abstract class A
{
    abstract function test(string $s);
}
abstract class B extends A
{
    // overridden - still maintaining contravariance for parameters and covariance for return
    abstract function test($s) : int;
}

使用Argon2算法生成密码散列

允许分组命名空间的尾部逗号

<?php

use Foo\Bar\{
    Foo,
    Bar,
    Baz,
};

PHP 7.2 升级到 PHP 7.3

array_key_first — 获取指定数组的第一个键值

array_key_last() 获取一个数组的最后一个键值

变化不大,新增内容比较多

PHP 7.3 升级到 PHP 7.4

属性添加限定类型

<?php
class User {
    public int $id;
    public string $name;
}
?>

箭头函数

骚操作,跟JS差不多了

<?php
$factor = 10;
$nums = array_map(fn($n) => $n * $factor, [1, 2, 3, 4]);
// $nums = array(10, 20, 30, 40);
?>

数组展开操作

<?php
$parts = ['apple', 'pear'];
$fruits = ['banana', 'orange', ...$parts, 'watermelon'];
// ['banana', 'orange', 'apple', 'pear', 'watermelon'];
?>

PHP 7.4.x 废弃

  • 没有显式括号的嵌套三元运算符
echo 1 ? 2 : 3 ? 4 : 5;   // deprecated 4
echo '<br>';
echo (1 ? 2 : 3) ? 4 : 5; // ok  4
echo '<br>';
echo 1 ? 2 : (3 ? 4 : 5); // ok 2
echo '<br>';

黑白课堂

  • 在一个对象中使用 array_key_exists() 已被废弃。请使用 isset() 或 property_exists() 来替代。
  • money_format() 函数已被废弃
  • implode() 允许反转参数顺序的特性已被废弃

提示

评论区 (0)

没有记录
支持 markdown,图片截图粘贴拖拽都可以自动上传。
黑白课堂

黑白课堂

混元大罗金仙 站长创业者玉树凌风每天醒来0收入

查看更多

最新视频课程

Laravel 的 PhpSpreadsheet 包入门

wap2App 入门讲解,100%速成,全面为你讲解。

ace.js 打造一款属于你的 Web 编辑器,入门文档。

Laravel Permission 中文文档

解释 OAuth 2.0 认证 和使用场景说明

Laravel 之 horizon 队列管理界面系统

钻级赞助商