V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
cj323
V2EX  ›  PHP

PHP 8.5 加入了 pipe 语法

  •  
  •   cj323 · 6 天前 via iPhone · 4632 次点击

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

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

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

    59 条回复    2025-08-28 15:32:02 +08:00
    junkk
        1
    junkk  
       6 天前
    相当于把 str 对象化然后链式调用?

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

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

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

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

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

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

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

    有个限制比较难受就是只能用 只有第一个参数是 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 里。
    DOLLOR
        44
    DOLLOR  
       6 天前
    @guiyumin 当然了,所以很多函数式编程语言都会提供 pipeline operator 来解决套娃问题
    wangtian2020
        45
    wangtian2020  
       6 天前
    JavaScript 你崛起吧
    ywcjxf1515
        46
    ywcjxf1515  
       6 天前 via Android
    chenqh
        47
    chenqh  
       6 天前
    python 居然没有 pipe 这个操作符
    w3cll
        48
    w3cll  
       6 天前
    php 的异步也在推进了
    https://github.com/true-async/php-async
    WorseIsBetter
        49
    WorseIsBetter  
       6 天前
    @newtype0092 #43

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

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

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