PHP는 웹 개발 목적으로 많은 사용자가 사용하는 스크립팅 언어입니다. 최신 안정 및 업데이트 버전인 PHP 8.3이 2023년 11월 23일에 출시되었습니다. 2000년에 출시된 PHP 3.x 이후 많은 혁신과 변화가 있었습니다. PHP는 여전히 많은 사람들이 사용하는 가장 인기 있는 웹 개발(웹 디자인) 언어 중 하나입니다. 이 기사에서는 코드 예제를 통해 PHP 8.3의 혁신과 변경 사항을 조사하고 분석합니다.
PHP 8.3의 주요 새로운 기능 및 개선 사항
이전 PHP 버전인 PHP 8.2에 비해 PHP 8.3에는 많은 주요 혁신과 개선 사항이 있습니다. 동시에 일부 기능은 더 이상 사용되지 않습니다. 이제 코드 예제를 통해 혁신과 개선 사항을 하나씩 살펴보겠습니다.
형식화된 클래스 상수
유형 선언은 웹 개발 시 안정성을 높이고 오류율을 줄이는 개발자에게 매우 중요한 기능입니다. 클래스의 속성에 대한 유형 선언 기능이 PHP 7.4에 추가되었습니다. 이후 버전에서는 이 기능이 많이 개선되었지만 이 기능은 여전히 클래스의 상수에 사용할 수 없었습니다. PHP 8.3에서는 이제 클래스의 상수 유형을 선언할 수 있습니다.
// Doğru kullanım:
class MyClass {
// Bildirilen tür ve değer aynı
const string VERSION = "PHP 8.3"; // değer string
}
// Hatalı kullanım:
class MyClass {
// Bildirilen tür ile değer farklı
const int VERSION = "PHP 8.3"; // değer string
}
// Hatalı kullanım:
class MyClass {
// Bildirilen tür sınıf sabitleri için desteklenmiyor
const void VERSION = "PHP 8.3"; // değer string
}클래스 상수에는 일부 유형 선언이 지원되지 않습니다.
클래스 상수에 대해 지원되지 않는 유형 선언: void, callable, never
새로운 함수: json_validate()
JSON 형식의 데이터(json으로 인코딩된 데이터)로 작업할 때 데이터를 사용하기 전에 들어오는 데이터가 유효한지 확인해야 합니다. 우리는 PHP 8.3 이전 버전에서 다음이나 유사한 방법을 사용하여 이 작업을 수행했습니다.
// PHP 8.3'ten önceki sürümlerde JSON verisini doğrulama
$data = $json_decode($maybeJSON);
if (json_last_error() === JSON_ERROR_NONE) {
// $data ile gerçekleştirilecek işlemler
}이 이전 예에서 JSON 데이터의 유효성을 검사할 때 PHP는 데이터 크기에 따라 상당한 메모리를 소비할 수 있습니다. PHP 8.3에는 성능 중심의 빠른 솔루션인 json_validate()를 생성하는 새로운 PHP 함수가 추가되었습니다. 아래에 이 기능의 사용 시나리오를 예시했습니다.
// PHP 8.3'te JSON verisini doğrulama
$data = $json_decode($maybeJSON);
if (json_validate($maybeJSON)) {
// $data ile gerçekleştirilecek işlemler
}새로운 기능: #[재정의]
PHP에서 인터페이스를 구현할 때 인터페이스의 메소드에 대한 자세한 기능을 제공합니다. 클래스의 인스턴스를 생성할 때 동일한 이름과 호환되는 서명을 가진 대체 버전을 생성하여 상위 메서드를 재정의할 수 있습니다. 이로 인해 소프트웨어에 심각한 문제가 발생할 수 있습니다. 간단히 말해서, 문제는 우리가 간과한 작은 오타로 인해 main 메서드를 재정의했다고 생각한다는 것입니다.
PHP 8.3 #[Override] 기능은 이 문제에 대한 솔루션을 제공합니다. 이제 예제에서 이를 살펴보겠습니다.
class A {
protected function myOverrideFunc(): void {}
// Doğru kullanım
// Bu örnek çalışacak
// Üstteki sınıfta ilgili method var ve geçersiz kılındı
class B extends A {
#[\Override]
public function myOverrideFunc(): void {}
// Hatalı kullanım
// Bu örnek çalışmayacak, çünkü ana sınıfta method yok
// Muhtemelen gözden kaçan bir yazım hatası
class C extends A {
#[\Override]
public function myOverrideFunction(): void {}
}읽기 전용 속성의 심층 복제
PHP는 PHP 8.1에서 개별 클래스 속성을 읽기 전용으로 선언하고 이를 PHP 8.2에서 전체 클래스에 할당하는 기능을 도입했습니다. 그러나 대부분의 웹 개발자는 이러한 기능을 포함하는 클래스로 작업할 때 부과되는 제한으로 인해 프로그래밍 논리의 실용성이 저해된다고 생각했습니다.
이것을 바꾸려면 RFC 두 가지 주요 권장 사항이 제시되었습니다.
읽기 전용
readonly연장이 허용되지 않는 수업을 허용합니다.readonly복제 중에 기능을 다시 시작할 수 있도록 허용
두 번째 제안은 PHP 8.3에 포함되었습니다. 이 새로운 접근 방식은 PHP 8.3에 추가되었습니다. readonly 속성이 있는 클래스의 인스턴스readonly 속성) __clone 매직 메서드를 사용하여 다시 시작할 수 있습니다.
RFC의 이 코드 예제는 이 새로운 방법이 어떻게 작동하는지 이해하는 데 도움이 될 수 있습니다.
클래스 상수 및 열거형 멤버의 동적 가져오기
PHP의 다른 기능과 달리, 변수 이름으로 클래스 상수와 열거형 멤버를 캡처하는 것은 좀 더 복잡합니다. PHP 8.3 이전에는 아래 예와 같이 이를 수행할 수 있었습니다:
class Foo {
public function __construct(
public readonly DateTime $bar,
public readonly DateTime $baz
) {}
public function __clone() {
// Klon çağrıldığında $bar yeni bir DateTime alacak
$this->bar = clone $this->bar;
// Ardından bu metod çağrılacak
$this->cloneBaz();
}
private function cloneBaz() {
// Bu __clone içinden çağrıldığından dolayı doğru bir kullanımdır
unset($this->baz);
}
}
$foo = new Foo(new DateTime(), new DateTime());
$foo2 = clone $foo;class MyClass {
public const THE_CONST = 9;
}
enum MyEnum: int {
case FirstMember = 9;
case SecondMember = 10;
}
$constantName = 'THE_CONST';
$memberName = 'FirstMember';
echo constant('MyClass::' . $constantName);
echo constant('MyEnum::' . #memberName)->value;이제 위의 PHP 8.3 예제에서 클래스 및 열거형 정의를 사용하여 값을 가져옵니다.
$constantName = 'THE_CONST';
$memberName = 'FirstNumber';
echo MyClass::{$constantName};
echo MyEnum::{$memberName}->value;새로운 메소드: getBytesFromString()
이 방법은 PHP 8.3에 추가된 기능 중 가장 의외였다고 할 수 있습니다: 사전 승인된 문자 모음을 사용하여 임의의 텍스트 생성.
이 새로운 방법은 매우 간단하고 명확합니다. 메소드에 일부 문자를 리소스로 제공하고 사용할 문자 수를 지정합니다. 그게 다야! 이제 우리의 메소드는 지정된 길이에 도달할 때까지 임의의 문자로 결과를 반환합니다. 이제 예를 들어 이를 명확히 해보자.
$generateRandomString = new Random\Randomizer();
$allowedChars = 'ABCDEFGHJKMNPQRSTVWXYZ';
$generateRandomString->getBytesFromString($allowedChars, 6) // "MBDSFD" - rastgele gelen veri
$generateRandomString->getBytesFromString($allowedChars, 6) // "DJSDKA" - rastgele gelen veri
$generateRandomString->getBytesFromString($allowedChars, 4) // "SDLA" - rastgele gelen veri지정한 문자의 전체 길이보다 출력이 길어질 수 있습니다. 아래 예에서는 이 작업을 수행했습니다.
$generateRandomString = new Random\Randomizer();
$allowedChars = '123456';
$generateRandomString->getBytesFromString($allowedChars, 8) // "47384252" - rastgele gelen veri매개변수로 제공하는 문자가 모두 다른 경우 해당 문자가 선택될 확률은 동일합니다. 그러나 지원되는 문자 목록에 동일한 문자를 두 개 이상 추가하면 동일한 문자가 더 많이 출력에 표시되도록 할 수 있습니다. 다음 예에서 이를 보여주었습니다.
$generateRandomString = new Random\Randomizer();
$allowedChars = 'AAAAA12345';
$generateRandomString->getBytesFromString($allowedChars, 5) // "4AA12" - rastgele gelen veri
$generateRandomString->getBytesFromString($allowedChars, 8) // "38A19AA5" - rastgele gelen veri새로운 메소드: getFloat() 및 nextFloat()
이러한 혁신을 통해 PHP 8.3에는 PHP의 무작위 확장을 확장하는 두 가지 새로운 메서드인 getFloat() 및 nextFloat()가 도입되었습니다.
이러한 방법의 예:
$generateRandomNumber = new Random\Randomizer();
// Rastgele ondalıklı (float) bir rakam oluştur
// Değer 0 ile 5 arasında olsun
$generateRandomNumber->getFloat(0,5); // 2.483929 - rastgele gelen veri
// 0 ile 1 arasında rastgele ondalıklı bir rakam oluştur
$generateRandomNumber->nextFloat(); // 0.4828258 rastgele gelen veriPHP 8.3의 사소한 혁신 및 개선
위의 혁신 외에도 PHP 8.3에는 수십 가지의 소규모 개선 및 혁신이 포함되어 있습니다. 아래 목록에 해당 원본 문서와 함께 나열되어 있습니다.
- DOMElement 클래스의 새로운 메소드:
DOMElement::getAttributeNames(),DOMElement::insertAdjacentElement(),DOMElement::insertAdjacentText(),DOMElement::toggleAttribute(),DOMNode::contains(),DOMNode::getRootNode(),DOMNode::isEqualNode()DOMNameSpaceNode::contains() 및MParentNode::replaceChildren(). - IntlCalendar 클래스의 새로운 메서드:
IntlCalendar::setDate(),IntlCalendar::setDateTime(),IntlGregorianCalendar::createFromDate()그리고IntlGregorianCalendar::createFromDateTime(). - 새로운 LDAP 기능: ldap_connect_wallet() 및 ldap_exop_sync().
- 새로운
mb_str_pad()멀티바이트 문자열 함수(멀티바이트 문자열 함수). - 새로운 POSIX 기능:
posix_sysconf(),posix_pathconf(),posix_fpathconf()그리고posix_eaccess(). - 새로운 방법:
ReflectionMethod::createFromMethodName() - 새로운 소켓 기능:
socket_atmark(). - 새로운 문자열(텍스트) 기능:
str_increment(),str_decrement(), 그리고stream_context_set_options(). - 새로운 ZipArchive 클래스 메소드:
ZipArchive::getArchiveFlag(). - 최대 허용 스택 크기를 설정하는 새로운 php.ini 설정:
zend.max_allowed_stack_size.
PHP 8.3에서 더 이상 사용되지 않음
PHP의 새 버전이 나올 때마다 일부 코드는 더 이상 사용되지 않는 것으로 표시됩니다. 이러한 기능이 완전히 사용되지 않으면 사용하지 않는 것이 좋습니다. 더 이상 사용되지 않는 코드가 사용되면 코드가 실행될 때 오류 메시지가 반환됩니다.
PHP 8.3의 지원 중단 목록:
- U_MULTIPLE_DECIMAL_SEPARATORS 상수는 더 이상 사용되지 않습니다.
- 19937산
3MT_RAND_PHP이 변형은 더 이상 사용되지 않습니다. ReflectionClass::getStaticProperties()더 이상 null을 허용할 수 없습니다.- PHP.ini 설정
assert.active,assert.bail,assert.callback,assert.exception그리고assert.warning더 이상 사용되지 않습니다. get_class()그리고get_parent_class()더 이상 사용되지 않습니다.
PHP 8.3
이 기사에서는 PHP 8.3의 중요한 변경 사항과 혁신을 검토했습니다. PHP 8.3의 모든 변경 사항에 대한 자세한 목록을 보려면 공식 변경 내역 검토해 보시기 바랍니다. 코드나 사이트를 PHP 8.2에서 PHP 8.3으로 업그레이드하려는 경우 이 가이드가 유용할 수 있습니다. PHP 8.3 마이그레이션 가이드 -> https://www.php.net/manual/en/migration83.php
PHP 버전 및 마이그레이션이 걱정된다면 새 버전을 PHP 8.3으로 업그레이드하는 데 시간을 투자하는 것이 좋습니다.
PHP 및 JavaScript 언어와 Onur Özden Web Çözümleri과 같은 관련 기술의 전체 범위 웹 소프트웨어 우리는 서비스를 제공합니다. 문의사항이나 요청사항이 있으신 경우 왼쪽 하단의 Whatsapp 버튼을 통해 빠르게 문의하시면 견적을 받으실 수 있습니다.



