cj323
V2EX  ›  PHP

PHP 8.5 加入了 pipe 语法

  •  
  •   cj323 · Aug 27, 2025 via iPhone · 9234 views
    This topic created in 439 days ago, the information mentioned may be changed or developed.

    https://php.watch/versions/8.5/pipe-operator

    $result = "Hello World"
        |> strtoupper(...)
        |> str_shuffle(...)
        |> trim(...);
    

    同样语法 JS 那边卡了很久,PHP 直接上了。

    59 replies  •  2025-08-28 15:32:02 +08:00
    junkk
    junkk
    Aug 27, 2025
    1
    相当于把 str 对象化然后链式调用?

    只能算是加了个语法糖吧?
    dragondove
    dragondove
    Aug 27, 2025
    2
    可能因为 JS 有 oop ,oop 链式调用可以达到相同的效果,只不过外部扩展需要有 extension method 之类的特性,extension method 可以覆盖 pipe 的功能。
    dragondove
    dragondove
    Aug 27, 2025
    3
    @junkk 是语法糖,但不是对象化,a |> x(...) |> y(...) 相当于 y(x(a)),用 pipe 可读性会好一点,编写的时候也会更符合人类思维(先用 x 处理再用 y 处理)
    luziafy
    luziafy
    Aug 27, 2025
    4
    相当于管道吧
    junkk
    junkk
    Aug 27, 2025
    5
    @dragondove #3 嗯。。。感觉是个无关紧要的东西....

    py 那种万物皆对象的早就这么做了
    ooTwToo
    ooTwToo
    Aug 27, 2025
    6
    相当于 Java 里的 Builders ?
    cbythe434
    cbythe434
    Aug 27, 2025
    7
    逐渐变成 perl
    crocoBaby
    crocoBaby
    Aug 27, 2025
    8
    JS 也有啊
    dongisking
    dongisking
    Aug 27, 2025❤️3
    9
    |>
    这语法果然只有 php 才想的出来...
    way2create
    way2create
    Aug 27, 2025
    10
    看着有点丑陋
    635925926
    635925926
    Aug 27, 2025
    11
    java 里的 Stream ?
    xiangyuecn
    xiangyuecn
    Aug 27, 2025❤️1
    12
    满屏幕的$,这样写至少少一半的$,也算是 php 特色了
    mandex
    mandex
    Aug 27, 2025
    13
    @dongisking 不是哦,很早之前 JS 就说要用|>了,但是现在还没有搞好。https://github.com/tc39/proposal-pipeline-operator
    aloxaf
    aloxaf
    Aug 27, 2025❤️5
    14
    @dongisking 这语法在函数式语言里常见的很……
    sky3hao9
    sky3hao9
    Aug 27, 2025
    15
    PHP 还活着也属于奇迹
    zjsxwc
    zjsxwc
    Aug 27, 2025
    16
    就是把类似 C 语言的面向过程的函数,也能和面向对象的链式调用一样使用。

    $pureData |> c_function1() |> c_function2() |> c_function3();

    $obj->method1()->method2()->method3();
    zhengwenk
    zhengwenk
    Aug 27, 2025
    17
    这语法也太丑了
    Steaven
    Steaven
    Aug 27, 2025❤️1
    18
    我最早在 elixir 使用这个语法,现在 php 也增加了,确实是可以👍
    liuliuliuliu
    liuliuliuliu
    Aug 27, 2025
    19
    这范例里的两个系统函数:strtoupper 和 str_shuffle 是什么命名规则?
    Tokin
    Tokin
    Aug 27, 2025
    21
    |> 怎么这么奇怪的语法
    Ashore
    Ashore
    Aug 27, 2025 via Android❤️3
    22
    PHP 是世界上最好的语言。
    panlatent
    panlatent
    Aug 27, 2025
    23
    @liuliuliuliu 这就是 PHP 早期混乱、缺乏设计的活化石,没有规则

    新特性就叫管道操作符,结合 (...) 语法更为直观。这个符号并不丑陋,启用连字的话还是挺直观的。

    没有什么魔法,只是让 PHP 程序员更舒服而已,仅此。
    panlatent
    panlatent
    Aug 27, 2025
    24
    @Tokin 很多语言都用的是这个语法,"|" 也挺适合但被大多数语言定义为了或运算操作符。 |> 在启用了连字字体里,一般显示为 “▷” 。
    lululau
    lululau
    Aug 27, 2025
    25
    |> 这个语法来自 Elixir 吧,上面就以为提到 Elixir 的,都这么没见过世面吗
    mx1700
    mx1700
    Aug 27, 2025 via Android
    26
    |> 是管道语法的主流设计啊,怎么还有人说什么丑,奇怪,PHP 才想得出。。。
    Smileh
    Smileh
    Aug 27, 2025❤️2
    27
    @dongisking #9
    菜就多练 少发帖
    FalconD
    FalconD
    Aug 27, 2025❤️1
    28
    @dongisking 猜你想看:
    ````haskell
    (<$>) :: Functor f => (a -> b) -> f a -> f b
    (<*>) :: Applicative f => f (a -> b) -> f a -> f b
    (<|>) :: Alternative f => f a -> f a -> f a
    (>>=) :: Monad m => m a -> (a -> m b) -> m b
    (>=>) :: Monad m => (a -> m b) -> (b -> m c) -> a -> m c
    (^>>) :: Arrow a => (b -> c) -> a c d -> a b d
    (<+>) :: ArrowPlus a => a b c -> a b c -> a b c
    ````
    jmtung
    jmtung
    Aug 27, 2025❤️1
    29
    @xiangyuecn 陈年老梗,每敲一个变量获得 1$收入
    oxygenkun101
    oxygenkun101
    Aug 27, 2025
    30
    php8 之后的更新挺现代的,这管道确实改善 quality of life
    eratpfus7
    eratpfus7
    Aug 27, 2025
    31
    还在 php
    tt67wq
    tt67wq
    Aug 27, 2025
    32
    Elixir 也是这样的
    ben1024
    ben1024
    Aug 27, 2025
    33
    oh
    AV1
    AV1
    Aug 27, 2025
    34
    真希望 JS 也能早点用上,实在受够了 a(b(c(d)))这样的套娃代码了🐶
    dajj
    dajj
    Aug 27, 2025
    35
    稀奇古怪的玩意
    kxg3030
    kxg3030
    Aug 27, 2025
    36
    php 的社区是最听劝的社区 php 非常不错~
    keer
    keer
    Aug 27, 2025
    37
    这语法还不直观吗?

    将上一步的结果通过管道(|)的方式,重定向(>)到下一步处理函数进行计算。
    akiyamamio
    akiyamamio
    Aug 27, 2025
    38
    @mx1700 #26
    为了黑而黑,每次提到 PHP 都要把“$”这个还要再拿出来黑一次
    典型的 JAVA 思维.jpg
    fkdtz
    fkdtz
    Aug 27, 2025
    39
    至少能够实现开发效率和可读性这两方面的提升,还是不错的
    guiyumin
    guiyumin
    Aug 27, 2025
    40
    @DOLLOR 这不是函数式的精髓吗?
    kwokky
    kwokky
    Aug 27, 2025
    41
    cool
    TerranC
    TerranC
    Aug 27, 2025 via iPhone
    42
    好像对于 bcadd bcsub 之类的总算不用一层套一层
    newtype0092
    newtype0092
    Aug 27, 2025
    43
    之前看到了,确实有些地方会方便一些。

    有个限制比较难受就是只能用 只有第一个参数是 require 的 callable 。
    (A major limitation of the pipe operator is that all the callables in the chain must accept only one required parameter.)

    这样的话像最常用的 array_map 之类一通嵌套处理的场景,想用 pipe 的方式还得包在 closure 里。
    AV1
    AV1
    Aug 27, 2025
    44
    @guiyumin 当然了,所以很多函数式编程语言都会提供 pipeline operator 来解决套娃问题
    wangtian2020
    wangtian2020
    Aug 27, 2025
    45
    JavaScript 你崛起吧
    ywcjxf1515
    ywcjxf1515
    Aug 27, 2025 via Android
    46
    ,
    simple2025
    simple2025
    Aug 27, 2025
    47
    python 居然没有 pipe 这个操作符
    w3cll
    w3cll
    Aug 27, 2025
    48
    php 的异步也在推进了
    https://github.com/true-async/php-async
    WorseIsBetter
    WorseIsBetter
    Aug 27, 2025
    49
    @newtype0092 #43

    等这个 RFC 实现了就没问题了: https://wiki.php.net/rfc/partial_function_application_v2
    newtype0092
    newtype0092
    Aug 27, 2025
    50
    @WorseIsBetter 大佬想的挺超前的,我看了 v1 版本 20 年就提了,不过投票差了一点没过,这次加了 pipe 的 case 不知道能不能过。
    jhdxr
    jhdxr
    Aug 28, 2025
    51
    @junkk #5 py 万物皆对象??? ruby 缓缓打出了一个问号

    而且 Python 哪来的 pipe 给你用,你在 python 里 y(x(a)) 不还是得老老实实写成 y(x(a))
    mshadow
    mshadow
    Aug 28, 2025 via Android
    52
    哎,php 最大的问题不是糖不够,而是糖太多了。fpm 虽然拉低了入门门槛,但严重制约了 php 的上限,为啥死活不改啊?
    lyxxxh2
    lyxxxh2
    Aug 28, 2025
    53
    确实很不错的功能。
    php 数组处理太蛋疼了, 要么定义多个变量,要么嵌套。
    我都是转 laravel collection 对象
    $result = collection(array)
    ->filter(fn() ...)
    ->map(fn() ..)

    而有了这个之后,我不再需要 laravecollectionl ,甚至更复杂的操作。
    $result = array
    |> array_filter(fn($item) => )
    |> array_map ..
    |> fn(..)
    akjarjash
    akjarjash
    Aug 28, 2025
    54
    PHP:
    注解:[]
    管道:|>
    都很独特🤣
    zjsxwc
    zjsxwc
    Aug 28, 2025
    55
    @mshadow #52
    你这信息 out 好几年了吧,
    frankenphp 都被 php 官方收编好几年了,就是来代替 php-fpm 的。
    EscYezi
    EscYezi
    Aug 28, 2025 via iPhone
    56
    @lyxxxh2 对 php 不太懂,但怎么感觉 laravel collection 版本看起来更短更一致(
    jhdxr
    jhdxr
    Aug 28, 2025
    57
    @mshadow 因为这东西需要深入理解才能改。改改语法糖啥的社群理解起来容易,RFC 容易通过,改起来也**相对**容易。至于底层的那些说实话 nikita 跑路后 dmitry 发个邮件都没啥能真正回应的人。。。
    2024
    2024
    Aug 28, 2025
    58
    关注下 https://github.com/php-any/origami GO 版本的 PHP, GUI 都能写
    zjsxwc
    zjsxwc
    Aug 28, 2025
    59
    @2024 #58 你好,这个 origami 语言,目前兼容 php 哪个版本的语法?
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2883 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 112ms · UTC 10:26 · PVG 18:26 · LAX 02:26 · JFK 05:26
    ♥ Do have faith in what you're doing.