PHP7.4 새로운 기능

PHP Core

Typed properties

클래스 속성은 이제 유형 선언을 지원합니다.

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

위의 예에서는 $user->id에 int 값만 할당할 수 있고 $user->name에는 문자열 값만 할당할 수 있습니다.

Arrow functions

화살표 함수는 암시적 값별 범위 바인딩을 사용하여 함수를 정의하기 위한 단축 구문을 제공합니다.

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

Limited return type covariance and argument type contravariance

이제 다음 코드가 작동합니다.

                  
<?php
class A {}
class B extends A {}

class Producer {
    public function method(): A {}
}
class ChildProducer extends Producer {
    public function method(): B {}
}
?>
                  
                

완전 분산 지원은 자동 로드가 사용되는 경우에만 사용할 수 있습니다. 모든 클래스가 참조되기 전에 사용 가능해야 하기 때문에 단일 파일 내에서 비순환 유형 참조만 가능합니다.

Null coalescing assignment operator

                  
<?php
$array['key'] ??= computeDefault();
// is roughly equivalent to
if (!isset($array['key'])) {
    $array['key'] = computeDefault();
}
?>
                  
                

Unpacking inside arrays

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

Numeric literal separator

숫자 리터럴은 숫자 사이에 밑줄을 포함할 수 있습니다.

                  
<?php
6.674_083e-11; // float
299_792_458;   // decimal
0xCAFE_F00D;   // hexadecimal
0b0101_1111;   // binary
?>
                  
                

Weak references

약한 참조를 사용하면 프로그래머가 개체가 파괴되는 것을 방지하지 않는 개체에 대한 참조를 유지할 수 있습니다.

Allow exceptions from __toString()

이제 __toString()에서 예외를 던지는 것이 허용됩니다. 이전에는 이로 인해 치명적인 오류가 발생했습니다. 문자열 변환에서 기존의 복구 가능한 치명적인 오류는 오류 예외로 변환되었습니다.


CURL

확장이 libcurl >= 7.56.0에 대해 빌드된 경우 CURLFile은 이제 일반 파일 이름 외에 스트림 래퍼를 지원합니다.


Filter

FILTER_VALIDATE_FLOAT 필터는 이제 FILTER_VALIDATE_INT와 동일한 의미로 min_rangemax_range 옵션을 지원합니다.


FFI

FFI는 네이티브 함수를 호출하고, 네이티브 변수에 액세스하고, C 라이브러리에 정의된 데이터 구조를 생성/액세스하는 간단한 방법을 제공하는 새로운 확장입니다.


GD

이미지에 스캐터 필터를 적용하기 위해 IMG_FILTER_SCATTER 이미지 필터를 추가했습니다.


Hash

Castagnoli의 다항식을 사용하여 crc32c 해시를 추가했습니다. 이 CRC32 변형은 iSCSI, SCTP, Btrfs 및 ext4와 같은 스토리지 시스템에서 사용됩니다.


Multibyte String

str_split()과 동일한 기능을 제공하지만 바이트가 아닌 코드 포인트에서 작동하는 mb_str_split() 함수를 추가했습니다.


OPcache

코드를 미리 로드하기 위한 지원이 추가되었습니다.


Regular Expressions (Perl-Compatible)

preg_replace_callback()preg_replace_callback_array() 함수는 이제 PREG_OFFSET_CAPTUREPREG_UNMATCHED_AS_NULL flags를 지원하여 추가 플래그 인수를 허용합니다. 이것은 콜백 함수에 전달된 일치 배열의 형식에 영향을 줍니다.


PDO

사용자 이름과 암호는 이제 mysql, mssql, sybase, dblib, firebird 및 oci 드라이버에 대한 PDO DSN의 일부로 지정할 수 있습니다. 이전에는 pgsql 드라이버에서만 지원했습니다. 사용자 이름/암호가 생성자와 DSN 모두에 지정된 경우 생성자가 우선합니다.

이제 SQL 쿼리에서 물음표를 이스케이프하여 매개변수 자리 표시자로 해석되는 것을 방지할 수 있습니다. 쓰기 ?? 단일 물음표를 데이터베이스에 보낼 수 있습니다. PostgreSQL JSON 키 존재(?) 연산자를 사용합니다.


PDO_OCI

이제 PDOStatement::getColumnMeta()를 사용할 수 있습니다.


PDO_SQLite

PDOStatement::getAttribute(PDO::SQLITE_ATTR_READONLY_STATEMENT)를 사용하면 명령문이 읽기 전용인지 여부, 즉 데이터베이스를 수정하지 않는지 확인할 수 있습니다.

PDO::setAttribute(PDO::SQLITE_ATTR_EXTENDED_RESULT_CODES, true)는 PDO::errorInfo()PDOStatement::errorInfo()에서 SQLite3 확장 결과 코드를 사용할 수 있도록 합니다.


SQLite3

마지막 확장 결과 코드를 가져오기 위해 SQLite3::lastExtendedErrorCode()를 추가했습니다.

추가된 SQLite3::enableExtendedResultCodes($enable = true), 이는 SQLite3::lastErrorCode()가 확장된 결과 코드를 반환하도록 합니다.


Standard

strip_tags() with array of tag names

strip_tags()는 이제 허용된 태그 배열도 허용합니다. strip_tags($str, ['a', 'p']) 대신 strip_tags($str, '<a><p>')를 작성할 수 있습니다.

Custom object serialization

__serialize__unserialize라는 두 가지 새로운 매직 메서드를 사용하는 사용자 지정 개체 직렬화를 위한 새로운 메커니즘이 추가되었습니다.

                  
<?php
// Returns array containing all the necessary state of the object.
public function __serialize(): array;

// Restores the object state from the given data array.
public function __unserialize(array $data): void;
?>
                  
                

새로운 직렬화 메커니즘은 미래에 더 이상 사용되지 않을 Serializable 인터페이스를 대체합니다.

Array merge functions without arguments

array_merge()array_merge_recursive()는 이제 인수 없이 호출될 수 있으며, 이 경우 빈 배열을 반환합니다. 이것은 스프레드 연산자와 함께 유용합니다. array_merge(...$arrays).

proc_open() function

proc_open()은 이제 명령에 대한 문자열 대신 배열을 허용합니다. 이 경우 프로세스는 쉘을 거치지 않고 직접 열리며 PHP는 필요한 인수 이스케이프를 처리합니다.

                  
<?php
  proc_open(['php', '-r', 'echo "Hello World\n";'], $descriptors, $pipes);
?>
                  
                

proc_open()은 이제 redirectnull 설명자를 지원합니다.

                  
<?php
  // Like 2>&1 on the shell
  proc_open($cmd, [1 => ['pipe', 'w'], 2 => ['redirect', 1]], $pipes);
  // Like 2>/dev/null or 2>nul on the shell
  proc_open($cmd, [1 => ['pipe', 'w'], 2 => ['null']], $pipes);
?>
                  
                

argon2i(d) without libargon

이제 password_hash()는 PHP가 libargon 없이 빌드될 때 나트륨 확장에서 argon2i 및 argon2id 구현을 갖습니다.