锟斤拷锟斤拷锟斤拷

锟斤拷为锟秸o拷Nullable锟斤拷锟斤拷锟斤拷

锟斤拷锟斤拷锟皆硷拷锟斤拷锟斤拷值锟斤拷锟斤拷锟斤拷锟斤拷锟节匡拷锟斤拷通锟斤拷锟斤拷锟斤拷锟斤拷前锟斤拷锟斤拷一锟斤拷锟绞猴拷使之锟斤拷锟斤拷为锟秸★拷 锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟绞憋拷锟斤拷锟斤拷锟侥诧拷锟斤拷锟斤拷锟竭猴拷锟斤拷锟斤拷锟截的斤拷锟揭达拷歉锟斤拷锟斤拷锟斤拷锟斤拷停锟揭达拷锟� null 锟斤拷

<?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();

锟斤拷锟斤拷锟斤拷锟教伙拷锟斤拷锟斤拷锟�

string(10) "elePHPant"
NULL
string(10) "elePHPant"
NULL
Uncaught Error: Too few arguments to function test(), 0 passed in...

Void 锟斤拷锟斤拷

一锟斤拷锟铰的凤拷锟斤拷值锟斤拷锟斤拷void锟斤拷锟斤拷锟诫。 锟斤拷锟斤拷值锟斤拷锟斤拷为 void 锟斤拷锟酵的凤拷锟斤拷要么锟缴达拷省去 return 锟斤拷洌词癸拷锟揭伙拷锟斤拷盏锟� return 锟斤拷洹� 锟斤拷锟斤拷 void 锟斤拷锟斤拷锟斤拷说锟斤拷NULL 锟斤拷锟斤拷一锟斤拷锟较凤拷锟侥凤拷锟斤拷值锟斤拷

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

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

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

锟斤拷锟斤拷锟斤拷锟教伙拷锟斤拷锟斤拷锟�

null
int(2)
int(1)

锟斤拷图去锟斤拷取一锟斤拷 void 锟斤拷锟斤拷锟侥凤拷锟斤拷值锟斤拷玫锟� NULL 锟斤拷锟斤拷锟揭诧拷锟斤拷锟斤拷锟斤拷魏尉锟斤拷妗o拷锟矫达拷锟斤拷锟皆拷锟斤拷遣锟斤拷锟接帮拷锟斤拷锟竭诧拷蔚姆锟斤拷锟斤拷锟�

Symmetric array destructuring

锟斤拷锟斤拷锟斤拷锟斤法锟斤拷[]锟斤拷锟斤拷锟斤拷锟斤拷为list()锟斤法锟斤拷一锟斤拷锟斤拷选锟筋,锟斤拷锟斤拷锟斤拷锟节斤拷锟斤拷锟斤拷锟街碉拷锟斤拷锟揭恍╋拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟�foreach锟叫o拷锟斤拷

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

// list() style
list($id1$name1) = $data[0];

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

// list() style
foreach ($data as list($id$name)) {
    
// logic here with $id and $name
}

// [] style
foreach ($data as [$id$name]) {
    
// logic here with $id and $name
}

锟洁常锟斤拷锟缴硷拷锟斤拷

锟斤拷锟斤拷锟斤拷支锟斤拷锟斤拷锟斤拷锟洁常锟斤拷锟侥可硷拷锟皆★拷

<?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 伪锟斤拷

锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷一锟斤拷锟铰的憋拷锟斤拷为iterable锟斤拷伪锟斤拷 (锟斤拷callable锟斤拷锟斤拷)锟斤拷 锟斤拷锟斤拷员锟斤拷锟斤拷诓锟斤拷锟斤拷锟斤拷叻锟斤拷锟街碉拷锟斤拷锟斤拷校锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟绞碉拷锟斤拷锟�Traversable锟接口的讹拷锟斤拷 锟斤拷锟斤拷锟斤拷锟洁,锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷时锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷战锟斤拷锟斤拷锟斤拷iterable锟斤拷锟酵碉拷array 锟斤拷一锟斤拷实锟斤拷锟斤拷Traversable锟侥讹拷锟襟。讹拷锟节凤拷锟斤拷值锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷乜锟斤拷锟斤拷 array锟斤拷锟斤拷蠓祷锟街碉拷锟斤拷偷锟�iterable锟斤拷

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

锟斤拷锟届常锟斤拷锟斤拷锟斤拷

一锟斤拷catch锟斤拷锟斤拷锟斤拷锟节匡拷锟斤拷通锟斤拷锟杰碉拷锟街凤拷(|)锟斤拷实锟街讹拷锟斤拷斐o拷牟锟斤拷锟� 锟斤拷锟斤拷锟斤拷锟揭憋拷锟斤拷锟斤拷锟斤拷圆锟酵拷锟侥诧拷同锟届常时锟斤拷锟斤拷锟矫★拷

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

list()锟斤拷锟斤拷支锟街硷拷锟斤拷

锟斤拷锟斤拷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];

// list() style
foreach ($data as list("id" => $id"name" => $name)) {
    
// logic here with $id and $name
}

// [] style
foreach ($data as ["id" => $id"name" => $name]) {
    
// logic here with $id and $name
}

支锟斤拷为锟斤拷锟斤拷锟街凤拷锟斤拷偏锟斤拷锟斤拷

锟斤拷锟斤拷锟斤拷锟斤拷支锟斤拷偏锟斤拷锟斤拷锟斤拷锟街凤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷 锟斤拷支锟街斤拷锟杰革拷锟斤拷锟斤拷为偏锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷通锟斤拷[]锟斤拷{}锟斤拷锟斤拷锟街凤拷锟斤拷锟铰憋拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷拢锟揭伙拷锟斤拷锟斤拷锟斤拷锟狡拷锟斤拷锟斤拷岜伙拷锟斤拷为一锟斤拷锟斤拷锟街凤拷锟斤拷锟斤拷尾锟斤拷始锟斤拷偏锟斤拷锟斤拷锟斤拷

<?php
var_dump
("abcdef"[-2]);
var_dump(strpos("aabbcc""b", -3));

锟斤拷锟斤拷锟斤拷锟教伙拷锟斤拷锟斤拷锟�

string (1) "e"
int(3)

Negative string and array offsets are now also supported in the simple variable parsing syntax inside of strings.

<?php
$string 
'bar';
echo 
"The last character of '$string' is '$string[-1]'.\n";
?>

锟斤拷锟斤拷锟斤拷锟教伙拷锟斤拷锟斤拷锟�

The last character of 'bar' is 'r'.

ext/openssl 支锟斤拷 AEAD

通锟斤拷锟斤拷openssl_encrypt()锟斤拷openssl_decrypt() 锟斤拷佣锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷支锟斤拷锟斤拷AEAD (模式 GCM and CCM)锟斤拷

通锟斤拷 Closure::fromCallable() 锟斤拷callables转为锟秸帮拷

Closure锟斤拷锟斤拷锟斤拷一锟斤拷锟斤拷态锟斤拷锟斤拷锟斤拷锟斤拷锟节斤拷callable锟斤拷锟劫碉拷 转为一锟斤拷Closure 锟斤拷锟斤拷

<?php
class Test
{
    public function 
exposeFunction()
    {
        return 
Closure::fromCallable([$this'privateFunction']);
    }

    private function 
privateFunction($param)
    {
        
var_dump($param);
    }
}

$privFunc = (new Test)->exposeFunction();
$privFunc('some value');

锟斤拷锟斤拷锟斤拷锟教伙拷锟斤拷锟斤拷锟�

string(10) "some value"

锟届步锟脚号达拷锟斤拷

一锟斤拷锟铰碉拷锟斤拷为 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

HTTP/2 server push support in ext/curl

锟皆凤拷锟斤拷锟斤拷锟斤拷锟酵碉拷支锟斤拷锟斤拷锟斤拷锟窖撅拷锟斤拷锟斤拷锟诫到 CURL 锟斤拷展锟叫o拷 锟斤拷要锟芥本 7.46 锟斤拷锟斤拷撸锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷通锟斤拷 curl_multi_setopt() 锟斤拷锟斤拷锟斤拷锟铰的筹拷锟斤拷 CURLMOPT_PUSHFUNCTION 锟斤拷锟斤拷锟叫碉拷锟节★拷锟斤拷锟斤拷 CURL_PUST_OK 锟斤拷 CURL_PUSH_DENY 也锟窖撅拷锟斤拷锟斤拷咏锟斤拷锟斤拷锟斤拷员锟斤拷锟斤拷锟斤拷锟斤拷锟酵的回碉拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟皆硷拷锟斤拷同锟斤拷锟杰撅拷锟斤拷锟斤拷