iyaozhen
V2EX  ›  PHP

PHP if 判断怎么简写?

  •  
  •   iyaozhen · Mar 26, 2016 · 12309 views
    This topic created in 3875 days ago, the information mentioned may be changed or developed.

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

    $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';
    

    有没有什么黑科技呀?

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

    Supplement 1  ·  Mar 26, 2016

    目前比较好的方法:

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

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

    29 replies  •  2016-03-31 09:10:19 +08:00
    imydou
    imydou
    Mar 26, 2016
    1
    if(true):

    endif;
    snailsir
    snailsir
    Mar 26, 2016 via iPhone
    2
    $str = substr($string, 21, 10)) || $str = '123';
    snailsir
    snailsir
    Mar 26, 2016 via iPhone❤️1
    3
    ($str = substr($string, 21, 10)) || $str = '123';

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

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

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

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

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

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

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

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

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

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

    像 golang 没有三目运算符就没这些事了
    ppto
    ppto
    Mar 31, 2016
    29
    php 内核代码在线查看工具, www.phpsourcechm.com #
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   4410 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 133ms · UTC 03:55 · PVG 11:55 · LAX 19:55 · JFK 22:55
    ♥ Do have faith in what you're doing.