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

PHP 8.5 加入了 pipe 语法

  •  
  •   cj323 · 1 天前 via iPhone · 4306 次点击

    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  
       1 天前
    相当于把 str 对象化然后链式调用?

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

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

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

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

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

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

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

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

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

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

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