# PHP 8.5의 새로운 기능들

> Clean Markdown view of GeekNews topic #24514. Use the original source for factual precision when an external source URL is present.

## Metadata

- GeekNews HTML: [https://news.hada.io/topic?id=24514](https://news.hada.io/topic?id=24514)
- GeekNews Markdown: [https://news.hada.io/topic/24514.md](https://news.hada.io/topic/24514.md)
- Type: GN+
- Author: [xguru](https://news.hada.io/@xguru)
- Published: 2025-11-21T11:08:52+09:00
- Updated: 2025-11-21T11:08:52+09:00
- Original source: [stitcher.io](https://stitcher.io/blog/new-in-php-85)
- Points: 2
- Comments: 1

## Topic Body

- PHP 8.5는 **파이프 연산자**, **clone with**, **새 URI 파서** 등 여러 기능을 포함한 주요 업데이트 버전  
- **파이프 연산자**는 함수 호출 체인을 단순화해 가독성과 유지보수성을 높임  
- **Clone with** 기능은 객체 복제 시 속성 값을 동시에 변경할 수 있게 하며, 일부 **readonly 속성**에는 제한 존재  
- **`#[NoDiscard]`** , **`(void)` 캐스트**, **클로저 상수 표현식 지원**, **fatal error 백트레이스 출력** 등 개발자 편의 기능 강화  
- **배열 처리, 속성 검증, 비표준 캐스트 폐기** 등 세부 개선과 **하위 호환성 관련 변경**이 포함된 버전  

---
### 주요 신규 기능

- **파이프 연산자 (`|>`)** 도입으로 함수의 결과를 다음 함수로 직접 전달하는 체인형 코드 작성 가능  
  - 중첩 함수 호출 대신 단계별로 데이터를 변환하는 구조 지원  
  - 예시 코드에서는 `trim`, `str_replace`, `strtolower` 등을 순차적으로 연결  

- **Clone with** 기능을 통해 객체 복제 시 속성 값을 동시에 변경 가능  
  - 예시 클래스 `Book`에서 `clone($this, ['title' => $title])` 형태로 사용  
  - 단, 외부에서 **readonly 속성**을 복제할 때는 `public(set)` 접근 지정 필요  

- **`#[NoDiscard]` 속성**과 **`(void)` 캐스트** 추가  
  - 반환값을 무시하면 경고를 발생시키는 함수 표시 가능  
  - `(void)` 캐스트를 사용하면 경고 억제 가능  

- **클로저 개선**으로 상수 표현식 내에서 **클로저 및 일급 호출 가능 객체** 사용 가능  
  - 예시에서는 `#[SkipDiscovery(static function (...))]` 형태로 속성 내 정의  
  - 이러한 클로저는 반드시 `static`으로 선언해야 하며 외부 변수 접근 불가  

- **Fatal error 백트레이스 출력** 기능 추가  
  - 이전에는 표시되지 않던 **스택 추적 정보**가 오류 메시지에 포함되어 디버깅 용이  

### 배열 및 URI 관련 기능

- **`array_first()`** , **`array_last()`** 함수 추가  
  - 배열의 첫 번째 및 마지막 요소를 간단히 반환  
  - 기존 `array_key_first()`와 `array_key_last()`를 이용한 복잡한 접근 방식 대체  

- **새로운 URI 파서** 추가  
  - `Uri\Rfc3986\Uri` 클래스를 통해 `getHost()`, `getScheme()`, `getPort()` 등 메서드 제공  
  - URI 조작 및 분석을 단순화  

### 속성 및 검증 관련 기능

- **`#[DelayedTargetValidation]` 속성** 도입  
  - `#[Override]` 등 일부 속성의 검증 시점을 **컴파일 타임에서 런타임으로 지연** 가능  
  - 하위 호환성 문제를 완화하기 위한 목적  

### 기타 소규모 변경 사항

- **정적 속성의 비대칭 가시성(asymmetric visibility)** 지원  
- **클래스 외 상수에도 속성(attribute)** 부여 가능  
- **생성자 프로퍼티 승격(property promotion)** 이 **final 속성**에도 적용 가능  
- **`#[\Override]` 속성**을 **프로퍼티에도 적용** 가능  
- **Dom\Element::$outerHTML** 속성 추가  
- **Exif 확장**이 **HEIF/HEIC 이미지** 지원  
- **`filter_var()`** 호출 시 **`FILTER_THROW_ON_FAILURE` 플래그** 추가  

### 폐기 및 비호환 변경

- **비표준 캐스트 이름** `(boolean)`, `(integer)` 등 사용 중단  
- **백틱(```)을 `shell_exec()`의 별칭으로 사용하는 방식** 폐기  
- **상수 재선언** 기능 폐기  
- **`disabled_classes` ini 설정** 제거  
- 전체 변경 및 폐기 목록은 [PHP 8.5 업그레이드 문서](https://github.com/php/php-src/blob/PHP-8.5/UPGRADING)에서 확인 가능  

### 전체 요약

- PHP 8.5는 **코드 가독성, 디버깅, 속성 처리, 배열 조작** 등 전반적인 개발 경험을 개선한 버전  
- **파이프 연산자**와 **URI 파서**는 실무 코드 단순화에 직접적인 영향을 미침  
- **속성 검증 지연**, **새 배열 함수**, **백트레이스 출력** 등은 유지보수성과 안정성을 높이는 변화  
- 일부 **비표준 문법 및 설정 폐기**로 코드 정비 필요  
- 전체적으로 **언어 일관성 강화와 개발자 편의성 향상**이 중심인 릴리스

## Comments



### Comment 46638

- Author: neo
- Created: 2025-11-21T11:08:53+09:00
- Points: 1

###### [Hacker News 의견](https://news.ycombinator.com/item?id=45989469) 
- 나는 여전히 **PHP**를 사랑함  
  23년 전 PHP용 암호화 소프트웨어를 만들었는데 아직도 잘 작동하고 있음  
  지금도 PHP 뉴스레터를 운영하고 있고, 여전히 강한 커뮤니티가 존재함  
  Python이나 Node.js도 쓰지만, 빠르고 단순한 작업에는 결국 PHP로 돌아오게 됨  
  다만 PHP 5 이후로 언어가 훨씬 **복잡해진 점**은 양날의 검 같음  
  - PHP는 **대규모 전환을 올바르게 수행한 대표적인 사례**라고 생각함  
    Python이 2에서 3으로 넘어가는 동안 PHP는 5.2→5.3, 5.6→7.0으로 발전했음  
    네임스페이스, PSR0 오토로딩, 파서 개선 등으로 속도와 구조가 크게 향상되었음  
    업데이트마다 호환성을 깨지 않으면서도 점진적으로 개선했고, 경고와 **shim**을 제공해 구버전 유지도 가능했음  
    PHP 6이 취소된 건 문자열 처리 변경 때문인데, 결과적으로 현명한 결정이었다고 봄  
    오랫동안 생계를 책임져준 언어이자 커뮤니티를 존중하는 프로젝트였음  
  - PHP가 복잡해졌다는 말이 많지만, 나는 5.3으로 만든 **단순한 코드**가 PHP 8에서도 완벽히 작동함  
    복잡하게 쓸 수도 있지만 꼭 그럴 필요는 없음  
  - 혹시 그 암호화 소프트웨어가 **Zend**였는지 궁금함  
    2000년대 중반에 Zend 관련 툴을 다뤘는데 꽤 까다로웠던 기억이 있음  
  - PHP 8은 처음부터 올바른 방식으로 배우면 충분히 이해하기 쉬움  
    PSR을 익히고 보안과 기능을 고려하면 훨씬 **안정적이고 강력한 언어**가 되었음  

- PHP 5 이후의 진화는 인상적이지만, 그만큼 **복잡성이 커진 문제**도 있음  
  예전 버전으로 배운 사람에게는 최신 코드베이스가 낯설고 따라가기 어려움  
  이는 커뮤니티에는 강점이지만, 복귀하려는 개발자에게는 장벽이 됨  
  - 최신 PHP는 여전히 **가독성이 좋은 언어**라고 생각함  
    10년간 C++을 썼지만, 지금은 최신 C++ 코드보다 PHP가 훨씬 읽기 쉬움  
  - PHP 8을 배우면 충분함. 지금의 PHP는 예전보다 훨씬 나아졌음  
  - 요즘 대부분의 소프트웨어가 비슷한 문제를 겪음  
    단순함이라는 목표가 사라지고, 기능만 계속 쌓이는 느낌임  
  - 사실 이런 변화는 다른 언어들도 마찬가지임  
    웹 분야는 특히 빠르게 변하므로 따라가지 않으면 도태됨  
  - Java 전문가로 일하면서도 새 기능을 동료들에게 설명해야 할 때가 많음  
    PHP는 특히 **입문자들이 첫 웹사이트를 만들 때** 많이 쓰는 언어라서 다른 언어보다 변화 체감이 클 수 있음  

- 많은 사람들이 PHP를 **부끄러워하는 경향**이 있지만, 나는 그렇지 않음  
  언어에 대해 잘 모르지만 멋진 프로젝트가 많다는 건 알고 있음  
  요즘 가장 좋아하는 PHP 프로젝트는 [BookStack](https://www.bookstackapp.com/)으로, 가족용 위키로 쓰고 있음  
  잘 관리된 PHP 스택으로 만들어진 사이트들이 여전히 많음  
  - 현대 PHP는 **빠르고 훌륭한 언어**임  
    2021~2023년에 프로덕션 PHP를 썼는데, 언어 자체보다 문제는 **낡은 코드베이스**와 **낮은 급여 수준**이었음  
    PHP 4 시절의 유산 코드가 많고, 데이터 접근 패턴도 제각각이라 유지보수가 힘듦  
    하지만 PHP 8로 마이그레이션하면서 코드 품질이 크게 향상됨  
    새 프로젝트를 시작한다면 PHP를 선택하진 않겠지만, **현대적 Laravel 프로젝트**라면 기꺼이 참여할 것임  
  - PHP는 다루기 **직관적이고 즐거운 언어**였음  
    다만 초보자들이 보안 개념 없이 접근하기 쉬워서 **SQL 인젝션 같은 문제**가 많았고, 그로 인해 ‘불안한 언어’라는 평판을 얻었음  
  - JS/TS + 최신 프레임워크보다 PHP 백엔드를 선호함  
    Laravel 같은 프레임워크와 함께 쓰면 훨씬 **안정적이고 성숙한 환경**임  
  - PHP로 커리어를 쌓아왔고, 지금도 그 **현대화 과정**을 즐기고 있음  
    기타 연주나 시 쓰기처럼 누구나 할 수 있지만, 잘하기는 어려운 일임  
  - [AzuraCast](https://github.com/AzuraCast/AzuraCast)를 좋아함  
    직접 코드를 보며 배우고, **라디오/음악 서버를 자가 호스팅**하는 재미가 있음  

- PHP는 업데이트될수록 **복잡해지는 언어**가 되었음  
  여전히 웹 중심 언어인데 왜 이렇게 발전하는지 의문임  
  - C#과 Java도 웹 백엔드 중심이라 복잡해졌음  
    결국 전통적인 **객체지향 언어들이 비슷한 방향**으로 수렴하는 것 같음  
  - 웹 자체가 점점 단순하지 않음  
  - [NativePhp](https://nativephp.com/) 같은 프로젝트도 있음  
    웹만을 위한 언어라 해도 발전할 이유는 충분함. **개발자 경험**을 개선하는 건 언제나 가치 있음  
  - 처음엔 글을 읽지 않고 비판했지만, 다시 보니 일부 기능은 괜찮음  
    array_first(), array_last()는 유용하지만, **파이프 연산자**는 유지보수성을 해칠 수 있음  
    단항 함수만 지원해 복잡한 함수에서는 오히려 버그를 유발할 수 있음  

- PHP 8.5 발표에서 가장 흥미로운 점은 언어의 **안정성과 성숙도**임  

- PHP가 GTA6보다 먼저 **array_first, array_last, fatal error stack trace**를 추가한다니 놀라움  
  - 좋은 추가 기능이지만, 사실 array_shift나 array_pop으로도 충분했음  

- PHP에 새로운 함수와 문법이 계속 추가되는 건 장기적으로 **유지보수 비용**을 높임  
  [공식 릴리스 노트](https://www.php.net/releases/8.5/en.php)를 보면, 일부 기능은 가치가 애매함  
  - URI 확장은 속도는 빠르지만, 기존 `parse_url()`과 중복됨  
  - 파이프 연산자는 취향 문제이며, 코드 스타일 일관성을 해칠 수 있음  
  - clone 개선은 미미한 변화임  
  - #Discard/void는 정적 분석기의 기능을 대체함  
  - 상수 내 클로저는 흥미롭지만, 복잡한 속성(#attribute)으로 이어질 수 있음  
  - **cURL 지속 핸들**은 진짜 성능 향상 요소임  
  - array_first()는 문법적 설탕 수준으로, 대규모 프로젝트에서는 거의 쓰이지 않을 듯함  

- [공식 PHP 8.5 릴리스 노트](https://www.php.net/releases/8.5/en.php)  

- 파이프 연산자 예시는 대부분의 언어에서 **임시 변수**를 쓰는 일반적인 방식을 생략한 것임  
  URL 파싱 예시도 `parse_url()`과 직접 비교되지 않았음  
  - `parse_url()`은 표준을 완전히 따르지 않고 상대 URL 처리에 약함  
    새 `uri()` 함수는 더 깔끔하고, **부분 함수 적용** 기능이 추가되면 파이프 체인이 더 읽기 쉬워질 것임  

- PHP CLI에서 **백틱(`)으로 shell_exec()을 호출**하곤 했는데, 이제 deprecated됨  
  `mkdir $dirname` 같은 식으로 자주 썼음  
  - 그건 **보안상 안티패턴**임  
    셸 메타문자 주입 위험이 있으므로 PHP의 `mkdir()`이나 `pcntl_exec()`을 써야 함
