PHP - If/else, for, foreach, while - without curly braces?

后端 未结 12 1599
佛祖请我去吃肉
佛祖请我去吃肉 2020-11-27 05:31

Something that really would like to know but never found out are shortcuts in PHP.

I am currently coding a function with a foreach loop with just a sing

相关标签:
12条回答
  • 2020-11-27 05:52

    As have said you don't wanna learn about shorthand's and accepted answer gives good example about omitting curly braces, but there is something to add. As you can see it's fine to omit curly braces in case of if ($x) echo 'foo';. There is nothing wrong with code, no performance or other issues and it is readable by other developers. And example also shows you that if you write

    if ($x)
        echo 'foo';
        echo 'bar';
    

    instead of

    if ($x)
        echo 'foo';
    
    echo 'bar';
    

    You can run into unwanted results where bar is printed while you don't want it to be printed and if your code is full of such statements then it will make it harder for you to read your own code and even more harder for others to read it.

    I don't wanna learn about shorthand's I just want to understand the conditions about when and where it is possible to omit the curly brackets.

    These things are closely related so if you really want to understand where it is possible to omit curly brackets then that should be a must that you understand or are at least aware of shorthand's , have read

    1. PHP Control Structures
    2. The PHP ternary conditional operators and expressions in general

    So my big question is: When can I omit the curly braces and in which structure/loop/function?

    The curly brace is not required however, for readability and maintenance, many developers would consider it bad style not to include them. Previous 2 links should give you information needed to make your own decisions when you could omit curly brace. for example there is nothing wrong with following code snippets which all do exactly same thing.

    With curly brace

    if (PHP_VERSION_ID < 70000)
    {
        print "PHP >= 7.0 required yours is ";
        print phpversion();
        print "\n";
        exit(1);
    }
    

    Is same as

    if (PHP_VERSION_ID < 70000) :
        print "PHP >= 7.0 required yours is ";
        print phpversion();
        print "\n";
        exit(1);
    endif;
    

    Or you can use the dot operator

    if (PHP_VERSION_ID < 80000)
        (print "PHP >= 7.0 required yours is ") . (print phpversion()) . (print "\n") . exit(1);
    

    And you can make use of the ternary conditional operator and even omit if it self besides omitting curly braces

    (PHP_VERSION_ID > 70000) ?: (print "PHP >= 7.0 required yours is ") . (print phpversion()) . (print "\n") . exit(1);
    

    Since we only print we can shorten that and strip some print string functions which were here to represent more than one function in statement without curly braces

    (PHP_VERSION_ID > 70000) ?: (print "PHP >= 7.0 required yours is " . phpversion() . "\n") . exit(1);
    

    As from php 7 we can use Null coalescing operator

    (PHP_VERSION_ID > 70000) ?: null ?? (print "PHP >= 7.0 required yours is ".phpversion() . "\n") . exit(1);
    

    As one can see that there is many ways you can get exactly the same result. That not only applies for this if example but same can be practiced with structure/loop/function. So there is no one answer for your big question. One should consider mainly following.

    1. Is the code you are writing easy to maintain.
    2. Can you answer for your self is there something you win by omitting curly braces.
    0 讨论(0)
  • 2020-11-27 05:53

    To complement @Marko's answer, be aware that when using the dot operator for this matter, you should enclose each operation in parentheses, otherwise it will reverse the order.

    For instance, this code below will print PHP >= 7.0 required yours is 5.6.15.

    (print "PHP >= 7.0 required yours is ") . (print phpversion()) . (print "\n");
    

    While this will print 5.6.151PHP >= 7.0 required yours is 1.

    print("PHP >= 7.0 required yours is ") . print(phpversion()) . print("\n");
    

    You can also use the and operator for this to work. Like so:

    if (PHP_VERSION_ID < 70000)
        print("PHP >= 7.0 required yours is ") and
        print(phpversion()) and
        print("\n");
    
    0 讨论(0)
  • 2020-11-27 05:54

    PHP shorthand expression was available since PHP 5.3

    $condition ? $value_if_true : $value_if_false
    
    $a ? $b : ( $c ? $d : ( $e ? $f : $g ) )
    
    0 讨论(0)
  • 2020-11-27 05:55

    It's possible when you have only one expression after your clause/

    For example,

    foreach($var as $value)
        if(1 + 1 == 2) {
            $arr[] = $value;
        };
    

    is correct, but

    foreach($var as $value)
        $somevar = $var;
        if(1 + 1 == 2) {
            $arr[] = $value;
        };
    

    is not, and php interpreter will think that if statement is outside foreach

    0 讨论(0)
  • 2020-11-27 06:03

    For single line statements.

    If you tried to do

    foreach($array as $x => $y)
        $do_something = $x;
        $do_something_else = $y;
    

    Unless I am mistaken the php interpreter will take the second line under the foreach statement as being outside of the implied braces

    Due to the indentation if you came back to this code at a later date, or another developer looked at your work it would be confusing.

    As such it is generally wise to always use braces with these statements. It will save later headache/confusion

    0 讨论(0)
  • 2020-11-27 06:04

    I omit curly braces in my PHP templates. E.g. you can use loops as follows:

    <ul>
        <?php foreach ($var as $value): ?>
            <li><?php echo $value; ?></li>
        <?php endforeach; ?>
    </ul>
    
    0 讨论(0)
提交回复
热议问题