florentino
V2EX  ›  PHP

完蛋了,为什么我感觉 PHP 的语法这么优雅呢

  •  
  •   florentino · Dec 5, 2025 · 8571 views
    This topic created in 332 days ago, the information mentioned may be changed or developed.

    temporal 官网示例

    python:

    @workflow.defn
    class SleepForDaysWorkflow:
        # Send an email every 30 days, for the year
        @workflow.run
        async def run(self) -> None:
            for i in range(12):
                # Activities have built-in support for timeouts and retries!
                await workflow.execute_activity(
                    send_email,
                    start_to_close_timeout=timedelta(seconds=10),
                )
    
                # Sleep for 30 days (yes, really)!
                await workflow.sleep(timedelta(days=30))
    

    ruby:

    
    # Send an email every 30 days, for the year
    class SleepForDaysWorkflow < Temporalio::Workflow::Definition
      def execute
        12.times do
          # Activities have built-in support for timeouts and retries!
          Temporalio::Workflow.execute_activity(
            SendEmailActivity,
            start_to_close_timeout: 10
          )
    
          # Sleep for 30 days (yes, really)!
          Temporalio::Workflow.sleep(30 * 24 * 60 * 60)
        end
      end
    end
    

    C#:

    [Workflow]
    public class SleepForDaysWorkflow
    {
        // Send an email every 30 days, for the year
        [WorkflowRun]
        public async Task RunAsync()
        {
            for (int i = 0; i < 12; i++)
            {
                // Activities have built-in support for timeouts and retries!
                await Workflow.ExecuteActivityAsync(
                    (Activities act) => act.SendEmail(),
                    new() { StartToCloseTimeout = TimeSpan.FromSeconds(10) });
    
                // Sleep for 30 days (yes, really)!
                await Workflow.DelayAsync(TimeSpan.FromDays(30));
            }
        }
    }
    

    PHP:

    class SleepForDaysWorkflow implements SleepForDaysWorkflowInterface
    {
      // Send an email every 30 days.
      public function sleepForDays(): void
      {
          for ($i = 0; $i < 12; $i++) {
              // Activities have timeouts, and will be retried by default!
              $this->sendEmailActivity->sendEmail();
    
              // Sleep for 30 days (yes, really)!
              Workflow::sleep(30 * 24 * 60 * 60)
          }
      }
    }
    

    感觉对于 java 程序员 php 的心智负担好小啊

    42 replies  •  2025-12-16 10:04:15 +08:00
    xtreme1
    xtreme1
    Dec 5, 2025
    1
    这几段代码首先语义上就不等价啊. php 的 async call 是配在框架里面了.
    jybox
    jybox
    Dec 5, 2025
    2
    @xtreme1 是等价的,几种语言都是做到框架里的(不可能真的 sleep 30 天)

    但我没看出来 PHP 优雅在哪里,感觉都差不多,PHP 稍微短一点是因为没写 timeout 而且省略了 sendEmailActivity 这个对象(显然这不是框架内置的)。
    florentino
    florentino
    OP
    Dec 5, 2025
    3
    @xtreme1 所以我说感觉嘛,我一眼看过去就知道是啥意思, 不像其他语言我还得去扒拉特殊语 法
    ragnaroks
    ragnaroks
    Dec 5, 2025
    4
    csharp 部分,ExecuteActivityAsync 这个方法的签名设计确实不行,不过很多涉及到时间段的部分总是 TimeSpan 确实也绷不住
    XIVN1987
    XIVN1987
    Dec 5, 2025
    5
    上面三个示例都有指定 10s timeout ,,PHP 的版本没指定啊,,这功能不完全一样吧
    XIVN1987
    XIVN1987
    Dec 5, 2025
    6
    python 的实现为啥不用继承,,而是使用装饰器??
    florentino
    florentino
    OP
    Dec 5, 2025
    7
    @XIVN1987 #6 不知道啊 官网的写法
    ccc008
    ccc008
    Dec 5, 2025❤️1
    8
    php 最不爽的就是$符
    4ark
    4ark
    Dec 5, 2025
    9
    @ccc008 #8 没有 $ 符,它跟 js 就很像了
    abigeater
    abigeater
    Dec 5, 2025
    10
    @XIVN1987 PHP 默认没有 timeout 说法,除非使用 swoole 类框架
    Smileh
    Smileh
    Dec 5, 2025
    11
    😏
    cj323
    cj323
    Dec 5, 2025 via Android
    12
    只写过 py 和 c#。纯美感上我认同这几个示例里 PHP 看着更舒服点。其他几个除 ruby 外显得有点繁杂。
    june4
    june4
    Dec 5, 2025
    13
    @4ark 什么 js,是 java ,可以说是抄袭了
    maigebaoer
    maigebaoer
    Dec 5, 2025 via Android
    14
    Java 程序员可以无缝切到 PHP
    chendy
    chendy
    Dec 5, 2025❤️4
    15
    我也不知道咋回事
    看到 PHP 仨字,右手小指就放在了 shift 上,食指放在了 4 上
    lscho
    lscho
    Dec 5, 2025
    16
    说实话,php 除了$符号,其他的语法真的足够简洁优雅
    urlk
    urlk
    Dec 5, 2025
    17
    没事, java 也支持 $ 做变量开头
    est
    est
    Dec 5, 2025
    18
    CodeCodeStudy
    CodeCodeStudy
    Dec 5, 2025
    19
    ruby 一大堆的 end
    passive
    passive
    Dec 5, 2025 via Android
    20
    要不是因为 cpan ,早就想从 Perl 转到 PHP 。当然,现在只剩 Python 了🐶
    x86
    x86
    Dec 5, 2025
    21
    @chendy #15 右手小拇指;键
    lvsp95
    lvsp95
    Dec 5, 2025
    22
    @maigebaoer #12 从 PHP 切到 Java 也很简单
    4ark
    4ark
    Dec 5, 2025
    23
    @june4 #13 也没毛病,毕竟 js 也是抄的 java
    liKeYunKeji
    liKeYunKeji
    Dec 5, 2025
    24
    php\javascript\java 都很相似。
    jimmzhou
    jimmzhou
    Dec 5, 2025
    25
    好多年没写 php 了 看到 php 的代码 感觉好亲切
    wogogoing
    wogogoing
    Dec 5, 2025
    26
    op 怎么没把 Go 的贴出来呀。哈哈哈。
    florentino
    florentino
    OP
    Dec 5, 2025
    27
    @wogogoing 因为 go 我也能看懂
    florentino
    florentino
    OP
    Dec 5, 2025
    28
    @ccc008 $符号我一看就知道是变量,跟 shell 一样
    wogogoing
    wogogoing
    Dec 5, 2025
    29
    @florentino 哈哈哈哈 不错不错
    mx1700
    mx1700
    Dec 6, 2025
    30
    看到 PHP 就感觉到左手小拇指有点抽筋
    NewYear
    NewYear
    Dec 6, 2025❤️1
    31
    PHP 最大的问题不是$,而是设计一塌糊涂,例如我要处理一个字符串,我要把这个字符串放在第几个参数?每个处理函数还不一样。

    这导致要单独记忆,很多人都是懂多种语言,没谁想单独为某个语言记一些垃圾玩意。

    另外就是 JS 这种可以链式调用,自动补全啥的都很优秀,php 这种……语法也不优美,函数套函数,函数套函数,眼睛都看不清楚引号和括号是哪个函数的(当年我写 vb 也有这个问题,烦)


    这也是为什么很多人说别学 C#,学了之后学不会其他语言了,因为设计是真的好,由奢入俭难。
    realpg
    realpg
    Dec 6, 2025
    32
    @urlk #17
    但是 java 不支持$$
    buffzty
    buffzty
    Dec 7, 2025
    33
    因为 php5 早期大多数代码是面向过程跟 c 语言一样.从业人员多菜鸟也多 c 语言的写法很难不写出屎山. php7 之后写的人基本用纯面向对象写法 跟 java 语法几乎一致 连 jar 包都抄过去了 php 里叫 phar.
    假如以前 php 的是 js,现在的 php 就是 ts
    realpg
    realpg
    Dec 8, 2025
    34
    @buffzty #33
    php 的后期版本维护者, 以及主流大框架, 都非得把 php 整成 java 那样 是我不爱用的根本原因

    本身就是轻量快捷开发优势语言 你往这个方向走 我干啥不去用 java 去啊! java 什么都多

    如果 php 框架能往 ruby on rails 那个方向走 还是很有价值的
    fuchish112
    fuchish112
    Dec 8, 2025
    35
    #34 语法糖哐哐输出,异步迟迟不出来,真的,老外脑回路不一样
    ltux
    ltux
    Dec 8, 2025
    36
    因为写得少。
    lizy0329
    lizy0329
    Dec 8, 2025
    37
    纯粹是 [技术品味] 差,而已
    guanzhangzhang
    guanzhangzhang
    Dec 8, 2025
    38
    怎么不给 golang 的放出来:
    ```
    // Send an email every 30 days, for the year
    func SleepForDaysWorkflow(ctx workflow.Context) error {
    for i := range 12 {
    // Activities have built-in support for timeouts and retries!
    _ = workflow.ExecuteActivity(ctx, SendEmail).Get(ctx, nil)

    // Sleep for 30 days (yes, really)!
    _ = workflow.Sleep(ctx, time.Hour*24*30)
    }
    }
    ```
    GabrielGarcia
    GabrielGarcia
    Dec 8, 2025
    39
    已经很久没有看到关于 php 的帖子了,从一开始的 tp3.2-->tp5.1-->ci-->gozero/hertz/kitex 。哈哈哈
    coderzhangsan
    coderzhangsan
    Dec 9, 2025
    40
    最后一句话才揭示了主题,因为现在的 php 跟 java 一样,都是纯 OOP 编程,设计模式以及相关语法几乎一样,当然他们之间也是有区别的,比如 php 只支持单继承/多态,重载的实现方式不一样,看到跟自己主语言设计相差较小的,自然而然就会觉得亲切,比如我最近在搞 python ,那 oop 语法,用 php 眼光来看,就是不伦不类。
    swordne
    swordne
    Dec 16, 2025
    41
    @coderzhangsan #40 php 也可以用 traits 来实现类似多继承的效果嘛。
    coderzhangsan
    coderzhangsan
    Dec 16, 2025
    42
    @swordne #41 实现是可以的,但是他们哲学设计理念不一样,traits 是组合大于继承。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1367 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 79ms · UTC 20:13 · PVG 04:13 · LAX 12:13 · JFK 15:13
    ♥ Do have faith in what you're doing.