추가 변경 로그 추가 변경 로그

PHP 8.3은 PHP 언어의 주요 업데이트입니다.

여기에는 클래스 상수의 명시적 입력, 읽기 전용 속성의 심층 복제, 임의성 기능 추가 등 많은 새로운 기능이 포함되어 있습니다. 언제나 그렇듯이 여기에는 성능 개선, 버그 수정 및 일반 정리도 포함됩니다.

지금 PHP 8.3으로 업그레이드하세요!

형식화된 클래스 상수

PHP < 8.3
interface I {
// We may naively assume that the PHP constant is always a string.
const PHP = 'PHP 8.2' ;
}

class Foo implements I {
// But implementing classes may define it as an array.
const PHP = [];
}
PHP 8.3
interface I {
const string PHP = 'PHP 8.2' ;
}

class Foo implements I {
const string PHP = [];
}
// Fatal error: Cannot use array as value for class constant
// Foo::PHP of type string

동적 클래스 상수 가져오기

PHP < 8.3
class Foo {
const PHP = 'PHP 8.2' ;
}

$searchableConstant = 'PHP' ;

var_dump ( constant ( Foo ::class . ":: { $searchableConstant } " ));
PHP 8.3
class Foo {
const PHP = 'PHP 8.3' ;
}

$searchableConstant = 'PHP' ;

var_dump ( Foo :: { $searchableConstant } );

New #[Override] attribute

PHP < 8.3
use PHPUnit\Framework\TestCase ;

final class MyTest extends TestCase {
protected $logFile ;

protected function setUp (): void {
$this -> logFile = fopen ( '/tmp/logfile' , 'w' );
}

protected function taerDown (): void {
fclose ( $this -> logFile );
unlink ( '/tmp/logfile' );
}
}

// The log file will never be removed, because the
// method name was mistyped (taerDown vs tearDown).
PHP 8.3
use PHPUnit\Framework\TestCase ;

final class MyTest extends TestCase {
protected $logFile ;

protected function setUp (): void {
$this -> logFile = fopen ( '/tmp/logfile' , 'w' );
}

#[ \Override ]
protected function taerDown (): void {
fclose ( $this -> logFile );
unlink ( '/tmp/logfile' );
}
}

// The log file will never be removed, because the
// method name was mistyped (taerDown vs tearDown).

By adding the #[Override] attribute to a method, PHP will ensure that a method with the same name exists in a parent class or in an implemented interface. Adding the attribute makes it clear that overriding a parent method is intentional and simplifies refactoring, because the removal of an overridden parent method will be detected.

읽기 전용 속성의 심층 복제

PHP < 8.3
class PHP {
public string $version = '8.2' ;
}

readonly class Foo {
public function __construct (
public PHP $php
) {}

public function __clone (): void {
$this -> php = clone $this -> php ;
}
}

$instance = new Foo (new PHP ());
$cloned = clone $instance ;

// Fatal error: Cannot modify readonly property Foo::$php
PHP 8.3
class PHP {
public string $version = '8.2' ;
}

readonly class Foo {
public function __construct (
public PHP $php
) {}

public function __clone (): void {
$this -> php = clone $this -> php ;
}
}

$instance = new Foo (new PHP ());
$cloned = clone $instance ;

$cloned -> php -> version = '8.3' ;

이제 읽기 전용 속성을 매직 __clone 메서드 내에서 한 번 수정하여 읽기 전용 속성의 심층 복제를 활성화할 수 있습니다.

새로운 json_validate() 함수

PHP < 8.3
function json_validate ( string $string ): bool {
json_decode ( $string );

return json_last_error () === JSON_ERROR_NONE ;
}

var_dump ( json_validate ( '{ "test": { "foo": "bar" }
}' )); // true
PHP 8.3
var_dump ( json_validate ( '{ "test": { "foo": "bar" }
}' )); // true

json_validate()를 사용하면 문자열이 구문적으로 유효한 JSON인지 확인할 수 있으며 json_decode()보다 더 효율적입니다.

새로운 Randomizer::getBytesFromString() 메서드

PHP < 8.3
// This function needs to be manually implemented.
function getBytesFromString ( string $string , int $length ) {
$stringLength = strlen ( $string );

$result = '' ;
for ( $i = 0 ; $i < $length ; $i ++) {
// random_int is not seedable for testing, but secure.
$result .= $string [ random_int ( 0 , $stringLength - 1 )];
}

return $result ;
}

$randomDomain = sprintf (
"%s.example.com" ,
getBytesFromString (
'abcdefghijklmnopqrstuvwxyz0123456789' ,
16 ,
),
);

echo $randomDomain ;
PHP 8.3
// A \Random\Engine may be passed for seeding,
// the default is the secure engine.
$randomizer = new \Random\Randomizer ();

$randomDomain = sprintf (
"%s.example.com" ,
$randomizer -> getBytesFromString (
'abcdefghijklmnopqrstuvwxyz0123456789' ,
16 ,
),
);

echo $randomDomain ;

PHP 8.2에 추가된 Random Extension은 특정 바이트로만 구성된 무작위 문자열을 생성하는 새로운 방법으로 확장되었습니다. 이 방법을 사용하면 개발자는 도메인 이름 및 임의 길이의 숫자 문자열과 같은 임의 식별자를 쉽게 생성할 수 있습니다.

새로운 Randomizer::getFloat() 및 Randomizer::nextFloat() 메서드

PHP < 8.3
// Returns a random float between $min and $max, both including.
function getFloat ( float $min , float $max ) {
// This algorithm is biased for specific inputs and may
// return values outside the given range. This is impossible
// to work around in userland.
$offset = random_int ( 0 , PHP_INT_MAX ) / PHP_INT_MAX ;

return $offset * ( $max - $min ) + $min ;
}

$temperature = getFloat (- 89.2 , 56.7 );
$chanceForTrue = 0.1 ;
// getFloat(0, 1) might return the upper bound, i.e. 1,
// introducing a small bias.
$myBoolean = getFloat ( 0 , 1 ) < $chanceForTrue ;
PHP 8.3
$randomizer = new \Random\Randomizer ();

$temperature = $randomizer -> getFloat (
-89.2 ,
56.7 ,
\Random\IntervalBoundary :: ClosedClosed ,
);

$chanceForTrue = 0.1 ;
// Randomizer::nextFloat() is equivalent to
// Randomizer::getFloat(0, 1, \Random\IntervalBoundary::ClosedOpen).
// The upper bound, i.e. 1, will not be returned.
$myBoolean = $randomizer -> nextFloat () <
$chanceForTrue ;

부동 소수점 숫자의 제한된 정밀도와 암시적 반올림으로 인해 특정 간격 내에 있는 편견 없는 부동 소수점을 생성하는 것은 쉽지 않으며 일반적으로 사용되는 사용자 영역 솔루션은 요청된 범위를 벗어나는 편향된 결과나 숫자를 생성할 수 있습니다.

또한 Randomizer는 편견 없는 방식으로 무작위 부동 소수점을 생성하는 두 가지 방법으로 확장되었습니다. Randomizer::getFloat() 메서드는 간격에서 무작위 부동 소수점 숫자 그리기에 게시된 γ-섹션 알고리즘을 사용합니다. 프레데릭 굴라르(Frédéric Goualard), ACM Trans. 모델. 계산. Simul., 32:3, 2022.

명령줄 린터는 여러 파일을 지원합니다.

PHP < 8.3
php -l foo.php bar.php
No syntax errors detected in foo.php
PHP 8.3
php -l foo.php bar.php
No syntax errors detected in foo.php
No syntax errors detected in bar.php

명령줄 linter는 이제 Lint에 대한 파일 이름에 대한 가변 입력을 허용합니다.

새로운 클래스, 인터페이스 및 함수

  • 새로운 DOMElement::getAttributeNames(), DOMElement::insertAdjacentElement(), DOMElement::insertAdjacentText(), DOMElement::toggleAttribute(), DOMNode::contains(), DOMNode::getRootNode(), DOMNode::isEqualNode(), DOMNameSpaceNode::contains() 및 DOMParentNode::replaceChildren() 메서드.
  • 새로운 IntlCalendar::setDate(), IntlCalendar::setDateTime(), IntlGregorianCalendar::createFromDate() 및 IntlGregorianCalendar::createFromDateTime() 메서드.
  • 새로운 ldap_connect_wallet() 및 ldap_exop_sync() 함수.
  • 새로운 mb_str_pad() 함수.
  • 새로운 posix_sysconf(), posix_pathconf(), posix_fpathconf() 및 posix_eaccess() 함수.
  • 새로운 ReflectionMethod::createFromMethodName() 메서드.
  • 새로운 소켓_atmark() 함수.
  • 새로운 str_increment(), str_decrement() 및 stream_context_set_options() 함수.
  • 새로운 ZipArchive::getArchiveFlag() 메서드.
  • Support for generation EC keys with custom EC parameters in OpenSSL extension.
  • 최대 허용 스택 크기를 설정하기 위한 새로운 INI 설정 zend.max_allowed_stack_size.
  • php.ini는 이제 대체/기본값 구문을 지원합니다.
  • 이제 익명 클래스는 읽기 전용이 될 수 있습니다.

지원 중단 및 이전 버전과의 호환성 중단

  • 더 적절한 날짜/시간 예외.
  • 빈 배열에 음수 인덱스 n을 할당하면 이제 다음 인덱스가 0이 아닌 n 1이 됩니다.
  • range() 함수로 변경됩니다.
  • Changes in re-declaration of static properties in traits.
  • U_MULTIPLE_DECIMAL_SEPERATORS 상수는 U_MULTIPLE_DECIMAL_SEPARATORS를 위해 더 이상 사용되지 않습니다.
  • MT_RAND_PHP Mt19937 변형은 더 이상 사용되지 않습니다.
  • ReflectionClass::getStaticProperties()는 더 이상 null을 허용하지 않습니다.
  • INI 설정 Assert.active, Assert.bail, Assert.callback, Assert.Exception 및 Assert.warning은 더 이상 사용되지 않습니다.
  • 인수 없이 get_class() 및 get_parent_class()를 호출하는 것은 더 이상 사용되지 않습니다.
  • SQLite3: 기본 오류 모드가 예외로 설정되었습니다.
더 나은 성능, 더 나은 구문, 향상된 유형 안전성. 지금 PHP 8.3으로 업그레이드하세요!

마이그레이션 가이드는 PHP 매뉴얼에서 확인할 수 있습니다. 새로운 기능과 이전 버전과 호환되지 않는 변경 사항에 대한 자세한 목록을 확인하세요.

이전 버전을 다운로드해야 하는 경우 다음을 볼 수 있습니다. 추가 변경 로그