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

PHP if 判断怎么简写?

  •  
  •   iyaozhen · 2016-03-26 20:43:02 +08:00 · 11132 次点击
    这是一个创建于 2946 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近经常写这样的代码,感觉很啰嗦:

    $array = [];
    
    $string = "0...balabala";
    // $start 和 $length 变量值不固定
    $str = substr($string, 1, 10);
    if ($str === false) {
        $str = '123';
    }
    
    $array[] = $str;
    

    三目运算?

    $str = substr($string, 1, 10) === false ? '123' : substr($string, 10, 10);
    

    substr 两次影响效率?

    ($str = substr($string, 1, 10)) === false ? $str = '123' : null;
    

    这样?(错误)

    $str = substr($string, 0, 1) ?: '123';
    

    有没有什么黑科技呀?

    业务都还没写完,天天想这些。感觉我这是病,得治。

    第 1 条附言  ·  2016-03-26 23:27:08 +08:00

    目前比较好的方法:

    ($str = substr($string, $start, $length)) !== false || $str = '123';
    
    // 条件:$start >= 0 $length > 0 符合一般的应用场景,推荐
    $array[] = isset( $string[$start] ) ? substr( $string, $start, $length ) : '123'; 
    

    然后如果是公司内部协作开发的话还是「不要标新立异」。

    29 条回复    2016-03-31 09:10:19 +08:00
    imydou
        1
    imydou  
       2016-03-26 20:45:18 +08:00
    if(true):

    endif;
    snailsir
        2
    snailsir  
       2016-03-26 20:58:56 +08:00 via iPhone
    $str = substr($string, 21, 10)) || $str = '123';
    snailsir
        3
    snailsir  
       2016-03-26 21:00:14 +08:00 via iPhone   ❤️ 1
    ($str = substr($string, 21, 10)) || $str = '123';

    漏了个括号
    iyaozhen
        4
    iyaozhen  
    OP
       2016-03-26 21:01:27 +08:00
    @snailsir $str 最终有可能等于 true
    iyaozhen
        5
    iyaozhen  
    OP
       2016-03-26 21:05:46 +08:00
    @snailsir 貌似不行,和 $str = substr($string, 0, 1) ?: '123'; 一样有弊端( 0 == false )

    还是要这样:($str = substr($string, 0, 1)) !== false || $str = '123';
    abelyao
        6
    abelyao  
       2016-03-26 21:23:49 +08:00   ❤️ 1
    $array[] = substr($string, $start, $length) or $array[] = '123';
    这样呢?
    tuuuz
        7
    tuuuz  
       2016-03-26 21:46:04 +08:00   ❤️ 1
    我觉得就按啰嗦的那种方式写吧~

    感觉可读性会比较好,如果以后有同事需要维护你的代码,他会感谢你的

    不喜勿喷😀
    hellov22ex
        8
    hellov22ex  
       2016-03-26 21:49:32 +08:00   ❤️ 1
    最正式或者说最通俗易懂的写法
    iyaozhen
        9
    iyaozhen  
    OP
       2016-03-26 21:53:45 +08:00 via Android
    @abelyao 这样有个坑。$array 有可能增加两个。😂 中间变量还是要的
    iyaozhen
        10
    iyaozhen  
    OP
       2016-03-26 21:57:42 +08:00 via Android
    @tuuuz 哈哈,这个赞同。
    xi4oh4o
        11
    xi4oh4o  
       2016-03-26 22:00:19 +08:00   ❤️ 1
    简单返回值的话用 expr1 ?: expr3
    剩下的 if else 不要少,只有 if 也不好
    abelyao
        12
    abelyao  
       2016-03-26 22:50:40 +08:00   ❤️ 1
    @iyaozhen 我晕… 我就是帮你简化到最简单的程度,你增加一个中间变量也不影响这个写法成不成立嘛,那就改成: $str = substr($string, $start, $length) or $str = '123';
    关键是这写法有没有其它坑,不懂你的实际应用情况~
    Sunyanzi
        13
    Sunyanzi  
       2016-03-26 23:02:54 +08:00   ❤️ 2
    为什么依赖 substr 的返回值 ..? 在 $start 非负 $length 恒正的情况下我会这么写 ...

    $array[] = isset( $string[1] ) ? substr( $string, 1, 10 ) : '123';

    对的我就是能不使用额外变量就不使用额外变量的三元狂魔 ...
    iyaozhen
        14
    iyaozhen  
    OP
       2016-03-26 23:04:14 +08:00
    @abelyao 额,不好意思。我没别的意思。只是我也那边试过,发现不行。

    嗯 这个目前看来是最优的,也便于阅读。但还是有点小问题,#5 楼。

    substr($string, $start, $length)有可能返回 0 ,布尔值是 false 。
    Lucups
        15
    Lucups  
       2016-03-26 23:07:12 +08:00   ❤️ 3
    你的代码不够啰嗦的后果就是你的同事会跟你啰嗦。

    :)
    iyaozhen
        16
    iyaozhen  
    OP
       2016-03-26 23:13:56 +08:00
    @Sunyanzi 赞,这个方法很巧妙呀。
    barbery
        17
    barbery  
       2016-03-26 23:14:48 +08:00
    $str || $str = '123';
    iyaozhen
        18
    iyaozhen  
    OP
       2016-03-26 23:16:56 +08:00
    @Lucups 嗯嗯,是的,道理我懂。多了解点「技巧」可以在自己项目里面用用。
    wudanyang
        19
    wudanyang  
       2016-03-26 23:21:07 +08:00   ❤️ 1
    $str = ($strTemp = substr($string, 1, 10)) === false ? '123' : $strTemp;
    loading
        20
    loading  
       2016-03-26 23:22:11 +08:00 via Android   ❤️ 1
    不要使用这些自己还没搞懂的代码!特别是团队。
    wudanyang
        21
    wudanyang  
       2016-03-26 23:40:26 +08:00
    @Lucups 可以写好注释
    g8287694
        22
    g8287694  
       2016-03-26 23:47:13 +08:00
    最近就在被各种简写 搞的疲惫不堪 看到这帖子 顿时一股火就直冒出来
    iyaozhen
        23
    iyaozhen  
    OP
       2016-03-26 23:52:33 +08:00
    @g8287694 。。。淡定,我就问问,不写。😂
    lostsnow
        24
    lostsnow  
       2016-03-27 01:36:24 +08:00
    不要简写
    yangqi
        25
    yangqi  
       2016-03-27 01:43:06 +08:00   ❤️ 1
    确实需要治,简写并不能说明你水平高,以后还会被别人背地里画圈圈的。
    shuimugan
        26
    shuimugan  
       2016-03-27 02:52:58 +08:00 via iPad   ❤️ 1
    “调试程序的难度是写代码的两倍。因此,如果你的代码写的太聪明了,恐怕就没能力调试它了。”

    我曾经改过一个可以拆成四行的三目运算符但是写在了同一行的代码,那酸爽。。。
    zjqzxc
        27
    zjqzxc  
       2016-03-27 10:28:48 +08:00   ❤️ 1
    难道不是应该把这段代码写到一个函数里吗?
    万一过几天需求改了要把 123 换成 456 难道还要挨着一个一个改。。
    kiwi95
        28
    kiwi95  
       2016-03-27 12:06:58 +08:00   ❤️ 1
    第一种就是推荐的写法,也不麻烦,就多两行代码而已,好理解多了。三目运算符太长了对于理解和调试都有很大的问题

    像 golang 没有三目运算符就没这些事了
    ppto
        29
    ppto  
       2016-03-31 09:10:19 +08:00
    php 内核代码在线查看工具, www.phpsourcechm.com #
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   894 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 21:20 · PVG 05:20 · LAX 14:20 · JFK 17:20
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.