PHP7.1 새로운 기능

Nullable types

매개 변수 및 반환 값에 대한 형식 선언은 이제 형식 이름에 물음표를 접두사로 붙여 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 functions

무효 반환 유형이 도입되었습니다. 반환 유형으로 void로 선언된 함수는 반환 문을 완전히 생략하거나 빈 반환 문을 사용해야 합니다. null은 void 함수에 대한 유효한 반환 값이 아닙니다.

                  
<?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로 평가됩니다. 그 이유는 경고가 일반 고차 함수의 사용과 관련이 있기 때문입니다.


Symmetric array destructuring

속기 배열 구문([])은 이제 여전히 지원되는 기존 list() 구문의 대안으로 할당(foreach 내 포함)을 위해 배열을 구조화하는 데 사용할 수 있습니다.

                  
<?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
}
                  
                

Class constant visibility

클래스 상수의 가시성을 지정하기 위한 지원이 추가되었습니다.

                  
<?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 pseudo-type

iterable이라는 새로운 의사 유형(호출 가능과 유사)이 도입되었습니다. Traversable 인터페이스를 구현하는 배열이나 객체를 허용하는 매개변수 및 반환 유형에 사용할 수 있습니다. 하위 유형 지정과 관련하여 자식 클래스의 매개 변수 유형은 부모의 array 또는 Traversable 선언을 iterable로 확장할 수 있습니다. 반환 유형을 사용하여 자식 클래스는 부모의 iterable 반환 유형을 Traversable을 구현하는 배열 또는 객체로 좁힐 수 있습니다.

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

Multi catch exception handling

이제 파이프 문자(|)를 사용하여 catch 블록당 여러 예외를 지정할 수 있습니다. 이것은 다른 클래스 계층의 다른 예외가 동일하게 처리되는 경우에 유용합니다.

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

Support for keys in 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
}
                  
                

Support for negative string offsets

음수 문자열 오프셋에 대한 지원이 오프셋을 허용하는 문자열 조작 함수와 [] 또는 {}를 사용한 문자열 인덱싱에 추가되었습니다. 이러한 경우 음수 오프셋은 문자열 끝에서 오프셋으로 해석됩니다.

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

위의 예는 다음을 출력합니다.

string (1) "e"
int(3)
                

음수 문자열 및 배열 오프셋은 이제 문자열 내부의 간단한 변수 구문 분석 구문에서도 지원됩니다.

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

위의 예는 다음을 출력합니다.

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

Support for AEAD in ext/openssl

추가 매개변수로 openssl_encrypt()openssl_decrypt() 함수를 확장하여 AEAD(GCM 및 CCM 모드)에 대한 지원이 추가되었습니다.


Convert callables to Closures with Closure::fromCallable()

콜러블Closures 객체로 쉽게 변환할 수 있도록 새로운 정적 메서드가 Closures 클래스에 도입되었습니다.

                  
<?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"
                

Asynchronous signal handling

pcntl_async_signals()라는 새로운 함수가 도입되어 틱을 사용하지 않고 비동기 신호 처리를 가능하게 했습니다(많은 오버헤드가 발생함).

                  
<?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 확장에 추가되었습니다(버전 7.46 이상 필요). 이것은 새로운 CURLMOPT_PUSHFUNCTION 상수와 함께 curl_multi_setopt() 함수를 통해 활용할 수 있습니다. CURL_PUSH_OK 및 CURL_PUSH_DENY 상수도 추가되어 서버 푸시 콜백의 실행을 승인하거나 거부할 수 있습니다.


Stream Context Options

tcp_nodelay 스트림 컨텍스트 옵션이 추가되었습니다.