PHP 8.3은 PHP 언어의 주요 업데이트입니다.
여기에는 클래스 상수의 명시적 입력, 읽기 전용 속성의 심층 복제, 임의성 기능 추가 등 많은 새로운 기능이 포함되어 있습니다. 언제나 그렇듯이 여기에는 성능 개선, 버그 수정 및 일반 정리도 포함됩니다.
지금 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
=
[];
}
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
동적 클래스 상수 가져오기
class
Foo
{
const
PHP
=
'PHP 8.2'
;
}
$searchableConstant
=
'PHP'
;
var_dump
(
constant
(
Foo
::class .
"::
{
$searchableConstant
}
"
));
class
Foo
{
const
PHP
=
'PHP 8.3'
;
}
$searchableConstant
=
'PHP'
;
var_dump
(
Foo
::
{
$searchableConstant
}
);
New #[Override] attribute
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).
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.
읽기 전용 속성의 심층 복제
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
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() 함수
function
json_validate
(
string $string
):
bool
{
json_decode
(
$string
);
return
json_last_error
() ===
JSON_ERROR_NONE
;
}
var_dump
(
json_validate
(
'{ "test": { "foo": "bar" }
}'
));
// true
var_dump
(
json_validate
(
'{ "test": { "foo": "bar" }
}'
));
// true
json_validate()를 사용하면 문자열이 구문적으로 유효한 JSON인지 확인할 수 있으며 json_decode()보다 더 효율적입니다.
새로운 Randomizer::getBytesFromString() 메서드
// 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
;
// 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() 메서드
// 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
;
$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 -l foo.php bar.php
No syntax errors detected in foo.php
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 매뉴얼에서 확인할 수 있습니다. 새로운 기능과 이전 버전과 호환되지 않는 변경 사항에 대한 자세한 목록을 확인하세요.
이전 버전을 다운로드해야 하는 경우 다음을 볼 수 있습니다. 추가 변경 로그