자유게시판

PHP 9 는 출시가 계속 미뤄져서 내년은 PHP 8.6 이라고해요

PHP 8.5 11월 20일 출시예요

 

큰 특징은 파이프 연산자가 생겼다는거네요

$input = ' Some kind of string. ';

$temp = trim($input);
$temp = str_replace(' ', '-', $temp);
$temp = str_replace(['.', '/', '…'], '', $temp);

$output = strtolower($temp);

이런 코드가 있다고하면

$output = $input 
    |> trim(...)
    |> fn (string $string) => str_replace(' ', '-', $string)
    |> fn (string $string) => str_replace(['.', '/', '…'], '', $string)
    |> strtolower(...);

 

이렇게요.

 

|> 는 opcode 에서 일반 변수할당으로 컴파일되기때문에
성능하락은 없다고 하네요.

 

 

PHP 8.4 에서는 LazyObject 가 도입되서 관련해서 성능향상이있었는데

PHP 8.5 는 눈에띄는 성능향상은 없네요.

 

https://php.watch/versions/8.5

 

 

라피 Lv. 2

댓글 3

  • 파이프 연산자와 관련해서 "와~ 편리하겠다!" 라는 느낌이 팍 오는 예제를 찾기가 힘드네요.

    위에 쓰신 코드처럼 오히려 더 길고 복잡해지는 경우가 많아서... ㅎㅎ

     

    다른 언어들처럼 $str->trim()->replace(...)->toLower() 이거나 좀 되면 좋겠습니다.

    기본적인 것이 안 되니까 자꾸 이상한 방식으로 때우려고 하는 것 같아요.

     

    아무튼 약간의 syntactic sugar 외에는 큰 변화가 없는 업데이트여서

    라이믹스도 PHP 8.5에서 유닛 테스트 돌리니까 별다른 문제 없이 다 호환되더군요.^^

  • @기진곰

    그건하려면 string 을 객체로 만들어야되서요
    기존 함수들은 c api 처럼 그냥 두고

    Text 인가하는 문자열 클래스 만든다고했다가 거절당한거로 기억나네요.

    파이프는 같은 클래스에 없어도 되죠.
    유닉스/리눅스에 파이프연산처럼 완전 다른거끼리도 그냥 주고받는 역할이니까요

     

     

    PFA 라고 부분함수 어플리케이션 문법도 8.6에 도입한다네요
    파이프랑 PFA 랑 모두 PHP 에 함수형 프로그래밍들 강화예요.

    파이프안에서 fn 써야되는게 php 엔진에서 클로저에서 외부변수 캡쳐가 제대로 안되는 문제때문이라는데요.

    $output = $input |> trim(...)
        |> fn (string $string) => str_replace(' ', '-', $string)
        |> fn (string $string) => str_replace(['.', '/', '…'], '', $string)
        |> strtolower(...);

    이게 PHP 8.5 고

    PFA 통과하면

    $output = $input  |> trim(...)
        |> str_replace(' ', '-')
        |> str_replace(['.', '/', '…'], '')
        |> strtolower(...);
    
    가 되요.
    
    원래 한번에 통과시키려고했는데 PFA 가 투표에서 과반을 못넘겨서 반쪽짜리가 되었어요.
  • @기진곰

    Text 클래스 도입관련 내부메일이예요

    https://externals.io/message/119149


    작성자는 Xdebug 만든 데릭이라는 사람인데

    내용은 mb_ 접두사랑 그냥 str 함수들이랑 나뉘어있어서 유니코드를 기본으로하는
    문자열 클래스였어요.

    반대하는 사람들 의견을 libicu 를 php 가 쓰는데 유니코드를 기본으로 하려면
    저 라이브러리가 리눅스에 있거나 익스텐션으로 설치되어야한다면서 의존성문제로 반대하는 의견도있고...

    세부 구현 메서드에서 Text->getPositionOfFirstOccurrence, getCodePointCount 나 이런게 있어서 이름이 길고, 메서드명 이상하다, subString 이냐 substring 이냐 이야기하다가  차라리 파이프연산이 있는게 더 좋겠다는 의견이 오갔네요.

    그뒤로는 이야기가없는데 오늘날 파이프 연산자가 나온거보면 완전히 중단된게 아닌가 싶어요.