PHP7.0 새로운 기능

Scalar type declarations

스칼라 유형 선언은 강제(기본값) 및 엄격의 두 가지 유형이 있습니다. 이제 문자열(문자열), 정수(int), 부동 소수점 숫자(float), 부울(bool)과 같은 매개변수 유형을 강제로 또는 엄격하게 적용할 수 있습니다. PHP 5에 도입된 다른 유형(클래스 이름, 인터페이스, 배열 및 호출 가능)을 보강합니다.

                  
<?php
// Coercive mode
function sumOfInts(int ...$ints)
{
    return array_sum($ints);
}

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

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

int(9)
                

엄격 모드를 활성화하려면 단일 선언 지시문을 파일 맨 위에 배치해야 합니다. 이는 스칼라 입력의 엄격함이 파일별로 구성됨을 의미합니다. 이 지시문은 매개변수의 유형 선언뿐만 아니라 함수의 반환 유형에도 영향을 미칩니다(반환 유형 선언, 내장 PHP 함수 및 로드된 확장의 함수 참조).

스칼라 유형 선언의 전체 문서 및 예제는 유형 선언 참조에서 찾을 수 있습니다.


Return type declarations

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
)
                

반환 유형 선언의 전체 문서 및 예제는 반환 유형 선언에서 찾을 수 있습니다. 참조.


Null coalescing operator

null 병합 연산자(??)는 isset()과 함께 삼항을 사용해야 하는 일반적인 경우에 대한 구문 설탕으로 추가되었습니다. 존재하고 null이 아닌 경우 첫 번째 피연산자를 반환합니다. 그렇지 않으면 두 번째 피연산자를 반환합니다.

                  
<?php
// Fetches the value of $_GET['user'] and returns 'nobody'
// if it does not exist.
$username = $_GET['user'] ?? 'nobody';
// This is equivalent to:
$username = isset($_GET['user']) ? $_GET['user'] : 'nobody';

// Coalescing can be chained: this will return the first
// defined value out of $_GET['user'], $_POST['user'], and
// 'nobody'.
$username = $_GET['user'] ?? $_POST['user'] ?? 'nobody';
?>
                  
                

Spaceship operator

우주선 연산자는 두 표현식을 비교하는 데 사용됩니다. $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
?>
                  
                

Constant arrays using define()

배열 상수는 이제 define()으로 정의할 수 있습니다. PHP 5.6에서는 const로만 정의할 수 있었습니다.

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

echo ANIMALS[1]; // outputs "cat"
?>
                  
                

Anonymous classes

새로운 클래스를 통해 익명 클래스에 대한 지원이 추가되었습니다. 다음은 폐기 객체에 대한 전체 클래스 정의 대신 사용할 수 있습니다.

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

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

object(class@anonymous)#2 (0) {
}
                

전체 문서는 익명 클래스 참조에서 찾을 수 있습니다.


Unicode codepoint escape syntax

이것은 16진수 형식의 유니코드 코드포인트를 취하고 UTF-8의 해당 코드포인트를 큰따옴표로 묶인 문자열이나 heredoc으로 출력합니다. 모든 유효한 코드 포인트가 허용되며 선행 0은 선택 사항입니다.

                  
<?php
echo "\u{aa}";
echo "\u{0000aa}";
echo "\u{9999}";
?>
                  
                

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

ª
ª (same as before but with optional leading 0's)
香
                

Closure::call()

Closure::call()은 일시적으로 개체 범위를 클로저에 바인딩하고 호출하는 보다 성능이 좋고 단축된 방법입니다.

                  
<?php
class A {private $x = 1;}

// Pre PHP 7 code
$getX = function() {return $this->x;};
$getXCB = $getX->bindTo(new A, 'A'); // intermediate closure
echo $getXCB();

// PHP 7+ code
$getX = function() {return $this->x;};
echo $getX->call(new A);
                  
                

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

1
1
                

Filtered unserialize()

이 기능은 신뢰할 수 없는 데이터에서 개체를 직렬화 해제할 때 더 나은 보안을 제공하려고 합니다. 개발자가 직렬화 해제할 수 있는 클래스를 화이트리스트에 추가할 수 있도록 하여 가능한 코드 삽입을 방지합니다.

                  
<?php

// converts all objects into __PHP_Incomplete_Class object
$data = unserialize($foo, ["allowed_classes" => false]);

// converts all objects into __PHP_Incomplete_Class object except those of MyClass and MyClass2
$data = unserialize($foo, ["allowed_classes" => ["MyClass", "MyClass2"]]);

// default behaviour (same as omitting the second argument) that accepts all classes
$data = unserialize($foo, ["allowed_classes" => true]);
                  
                

IntlChar

새로운 IntlChar 클래스는 추가 ICU 기능을 노출하려고 합니다. 클래스 자체는 유니코드 문자를 조작하는 데 사용할 수 있는 여러 정적 메서드와 상수를 정의합니다.

                  
<?php

printf('%x', IntlChar::CODEPOINT_MAX);
echo IntlChar::charName('@');
var_dump(IntlChar::ispunct('!'));
                  
                

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

10ffff
COMMERCIAL AT
bool(true)
                

이 클래스를 사용하려면 Intl 확장이 설치되어 있어야 합니다.


Expectations

Expectations는 이전 assert() 함수에 대한 이전 버전과 호환되는 개선 사항입니다. 프로덕션 코드에서 비용이 없는 주장을 허용하고 주장이 실패할 때 사용자 지정 예외를 throw하는 기능을 제공합니다.

이전 API는 호환성을 위해 계속 유지되지만, assert()는 이제 언어 구성이 되어 첫 번째 매개변수가 평가할 문자열이나 테스트할 부울 값이 아닌 표현식이 될 수 있습니다.

                  
<?php
ini_set('assert.exception', 1);

class CustomError extends AssertionError {}

assert(false, new CustomError('Some error message'));
?>
                  
                

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

Fatal error: Uncaught CustomError: Some error message
                

개발 및 프로덕션 환경 모두에서 구성하는 방법을 포함하여 이 기능에 대한 자세한 내용은 assert() 참조의 expectations 섹션에서 찾을 수 있습니다.


Group use declarations

동일한 네임스페이스에서 가져오는 클래스, 함수 및 상수를 이제 단일 use 문으로 그룹화할 수 있습니다.

                  
<?php
// Pre PHP 7 code
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+ code
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};
?>
                  
                

Generator Return Expressions

이 기능은 PHP 5.5에 도입된 생성기 기능을 기반으로 합니다. 생성기 내에서 return 문을 사용하여 최종 표현식이 반환되도록 할 수 있습니다(참조에 의한 반환은 허용되지 않음). 이 값은 새로운 Generator::getReturn() 메서드를 사용하여 가져올 수 있습니다. 이 메서드는 생성기가 값 생성을 완료한 후에만 사용할 수 있습니다.

                  
<?php

$gen = (function() {
    yield 1;
    yield 2;

    return 3;
})();

foreach ($gen as $val) {
    echo $val, PHP_EOL;
}

echo $gen->getReturn(), PHP_EOL;
                  
                

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

1
2
3
                

생성기에서 최종 값을 명시적으로 반환할 수 있는 것은 편리한 기능입니다. 이는 생성기를 실행하는 클라이언트 코드에서 특별히 처리할 수 있는 생성기(아마도 일부 형태의 코루틴 계산에서)가 최종 값을 반환할 수 있기 때문입니다. 이것은 클라이언트 코드가 먼저 최종 값이 생성되었는지 여부를 확인한 다음, 생성된 경우 해당 값을 구체적으로 처리하도록 하는 것보다 훨씬 간단합니다.


Generator delegation

생성기는 이제 yield from 구문을 사용하여 가장 바깥쪽 생성기에 상용구를 작성할 필요 없이 다른 생성기, Traversable 객체 또는 배열에 자동으로 위임할 수 있습니다.

                  
<?php
function gen()
{
    yield 1;
    yield 2;
    yield from gen2();
}

function gen2()
{
    yield 3;
    yield 4;
}

foreach (gen() as $val)
{
    echo $val, PHP_EOL;
}
?>
                  
                

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

1
2
3
4
                

Integer division with intdiv()

새로운 intdiv() 함수는 피연산자의 정수 나눗셈을 수행하고 반환합니다.

                  
<?php
var_dump(intdiv(10, 3));
?>
                  
                

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

int(3)
                

Session options

session_start()는 이제 일반적으로 php.ini에 설정된 세션 구성 지시문을 무시하는 옵션 배열을 허용합니다.

이 옵션은 또한 기본적으로 켜져 있고 세션 데이터가 변경된 경우 PHP가 세션 파일을 덮어쓰도록 하는 session.lazy_writesession_start()에만 전달할 수 있는 옵션인 read_and_close를 지원하도록 확장되었습니다. 세션 데이터를 읽은 다음 세션을 변경하지 않고 즉시 닫아야 함을 나타냅니다.

예를 들어 session.cache_limiter를 private로 설정하고 세션을 읽은 후 즉시 닫으려면:

                  
<?php
session_start([
    'cache_limiter' => 'private',
    'read_and_close' => true,
]);
?>
                  
                

preg_replace_callback_array()

새로운 preg_replace_callback_array() 함수를 사용하면 preg_replace_callback() 함수를 사용할 때 코드를 보다 깔끔하게 작성할 수 있습니다. PHP 7 이전에는 정규식별로 실행해야 하는 콜백을 사용하려면 많은 분기로 인해 콜백 함수가 오염되어야 했습니다.

이제 키는 정규식이고 값은 콜백인 연관 배열을 사용하여 각 정규식에 콜백을 등록할 수 있습니다.


CSPRNG Functions

플랫폼 간 방식으로 암호학적으로 안전한 정수 및 문자열을 생성하기 위해 random_bytes()random_int()의 두 가지 새로운 함수가 추가되었습니다.


list() can always unpack objects implementing ArrayAccess

이전에는 list()ArrayAccess를 구현하는 개체에서 올바르게 작동하지 않을 수 있습니다. 이 문제가 해결되었습니다.


Other Features

  • Class member access on cloning has been added, e.g. (clone $foo)->bar().