1P by GN⁺ 1일전 | ★ favorite | 댓글 1개
  • 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 업그레이드 문서에서 확인 가능

전체 요약

  • PHP 8.5는 코드 가독성, 디버깅, 속성 처리, 배열 조작 등 전반적인 개발 경험을 개선한 버전
  • 파이프 연산자URI 파서는 실무 코드 단순화에 직접적인 영향을 미침
  • 속성 검증 지연, 새 배열 함수, 백트레이스 출력 등은 유지보수성과 안정성을 높이는 변화
  • 일부 비표준 문법 및 설정 폐기로 코드 정비 필요
  • 전체적으로 언어 일관성 강화와 개발자 편의성 향상이 중심인 릴리스
Hacker News 의견
  • 나는 여전히 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으로, 가족용 위키로 쓰고 있음
    잘 관리된 PHP 스택으로 만들어진 사이트들이 여전히 많음

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

    • C#과 Java도 웹 백엔드 중심이라 복잡해졌음
      결국 전통적인 객체지향 언어들이 비슷한 방향으로 수렴하는 것 같음
    • 웹 자체가 점점 단순하지 않음
    • NativePhp 같은 프로젝트도 있음
      웹만을 위한 언어라 해도 발전할 이유는 충분함. 개발자 경험을 개선하는 건 언제나 가치 있음
    • 처음엔 글을 읽지 않고 비판했지만, 다시 보니 일부 기능은 괜찮음
      array_first(), array_last()는 유용하지만, 파이프 연산자는 유지보수성을 해칠 수 있음
      단항 함수만 지원해 복잡한 함수에서는 오히려 버그를 유발할 수 있음
  • PHP 8.5 발표에서 가장 흥미로운 점은 언어의 안정성과 성숙도

  • PHP가 GTA6보다 먼저 array_first, array_last, fatal error stack trace를 추가한다니 놀라움

    • 좋은 추가 기능이지만, 사실 array_shift나 array_pop으로도 충분했음
  • PHP에 새로운 함수와 문법이 계속 추가되는 건 장기적으로 유지보수 비용을 높임
    공식 릴리스 노트를 보면, 일부 기능은 가치가 애매함

    • URI 확장은 속도는 빠르지만, 기존 parse_url()과 중복됨
    • 파이프 연산자는 취향 문제이며, 코드 스타일 일관성을 해칠 수 있음
    • clone 개선은 미미한 변화임
    • #Discard/void는 정적 분석기의 기능을 대체함
    • 상수 내 클로저는 흥미롭지만, 복잡한 속성(#attribute)으로 이어질 수 있음
    • cURL 지속 핸들은 진짜 성능 향상 요소임
    • array_first()는 문법적 설탕 수준으로, 대규모 프로젝트에서는 거의 쓰이지 않을 듯함
  • 공식 PHP 8.5 릴리스 노트

  • 파이프 연산자 예시는 대부분의 언어에서 임시 변수를 쓰는 일반적인 방식을 생략한 것임
    URL 파싱 예시도 parse_url()과 직접 비교되지 않았음

    • parse_url()은 표준을 완전히 따르지 않고 상대 URL 처리에 약함
      uri() 함수는 더 깔끔하고, 부분 함수 적용 기능이 추가되면 파이프 체인이 더 읽기 쉬워질 것임
  • PHP CLI에서 **백틱()으로 shell_exec()을 호출**하곤 했는데, 이제 deprecated됨 mkdir $dirname` 같은 식으로 자주 썼음

    • 그건 보안상 안티패턴
      셸 메타문자 주입 위험이 있으므로 PHP의 mkdir()이나 pcntl_exec()을 써야 함