2012-01-04 35 views
39

真正想知道但從未發現的東西是PHP中的捷徑。PHP - If/else,for,foreach,while - 沒有大括號?

我目前正在用一個foreach循環編寫一個函數,其中只有一條語句。我試圖忽略大括號,就像你在if/else控制結構中可以做的那樣,它可以工作。沒有錯誤。

foreach($var as $value) 
    $arr[] = $value; 

現在我試着用同樣的方法,但在裏面放了一個if/else塊。再次,工作,沒有錯誤。

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

然後,我想,「爲什麼這個工作?」並省略了結束分號。還在工作。所以我試圖在foreach循環中使用if/else語句而不使用大括號,並且仍然可以正常工作並且沒有錯誤。但是,foreach循環現在真的關閉/結束了嗎?

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

至少我再次省略了閉合分號和(如預期)發生了分析錯誤。

所以我最大的疑問是:什麼時候可以省略花括號和結構/循環/函數?我知道我絕對可以在ifelse這樣做。但是whileforforeach呢?

是的,我知道這是不是安全,智能,無論無需花括號代碼和有像$condition ? true : false;if: doSomething(); endif;endfor;endforeach;速記。我不想了解shorthands我只想了解何時何地可以省略大括號的條件。

+3

順便說一句,沒有必要在右大括號後面加分號。它的語法含義是在它們之間添加一個空的語句。除了在C和C++中聲明'struct'和'class'外,所有類C語言都是如此。 – Eric 2012-01-04 12:06:10

+0

您需要了解語句和表達式之間的區別,以瞭解何時可以忽略卷積。然後,對錶達內聚的強烈理解仍然是必要的。 – mario 2012-01-04 12:10:56

+0

的工作原理與你所說的一樣:) – 2012-01-04 11:49:54

回答

68

當您省略大括號時,它只會將下一條語句視爲條件的主體。

if ($x) echo 'foo'; 

相同

if ($x) { echo 'foo'; } 

但請記住,

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

總是打印 「欄」

內部,它是周圍的其他方法:if只會看看下一個表達式,但PHP會對待每一個表達式在{}作爲一個單一的「分組」的表達。

同樣用於其它控制語句(foreach,等等)

+0

非常好,簡短的解釋,謝謝! :)它在每個控制結構上工作嗎? – headacheCoder 2012-01-04 11:56:18

+0

它應該。目前不知道(也不能測試)'do {} while($ X)','或'switch'。 – KingCrunch 2012-01-04 11:58:55

+0

@headacheCoder是的,它適用於'for',''while','foreach'和'if'。對於C語言的每種語言,它也是這樣。請注意@ tkone的答案,關於如何總是使用大括號是良好做法。 – Eric 2012-01-04 12:01:41

0

這是可能的,當你你的條款之後只有一個表情/

例如,

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

是正確的,但

不是,PHP解釋器會認爲if聲明不在foreach

1

對於單行語句。

如果你試圖做

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

除非是我弄錯了PHP解釋器將採取foreach語句下面第二行作爲隱含的括號

之外由於壓痕,如果你來了在稍後的日期回到這段代碼,或者其他開發者看着你的工作,這會讓人困惑。

因此,總是在這些語句中使用大括號是明智的。這將節省後來的頭痛/混亂

+0

你說得對。第二行不在循環內部。只有下一個表達式是。 – CommandZ 2014-03-19 02:03:40

4

我省略花括號在我的PHP模板。例如。你可以使用循環如下:

<ul> 
    <?php foreach ($var as $value): ?> 
     <li><?php echo $value; ?></li> 
    <?php endforeach; ?> 
</ul> 
+9

另一種語法是不同的。 – KingCrunch 2012-01-04 11:54:59

+1

OP甚至說他知道替代語法,而不是問題所在。 – CommandZ 2014-03-19 02:05:07

25

有些地方你可以,但你永遠不應該。

顯式爲總是好於隱式。

誰知道你什麼時候必須回去修改舊代碼。很容易錯過這些東西,這樣做沒有任何好處。

10

如果你只有一個參數!但是,如果你想省略大括號,你可以使用冒號和結束。 示例:

if(a < 1) : 
    echo "a is less than 1"; 
else : 
    echo "a is greater than 1"; 
endif; 
0

答案很簡單。這在C/C++中是一樣的。

if,if/else if/else if/else and loops =>如果下一條語句是單行,則可以省略大括號。

例:

for($i= 0; $i<=100; $i++) 
{ 
    if($i % 7 == 0) 
    { 
     echo $i . "<br>"; 
    } 

} 

它還可以這樣寫:

for($i= 0; $i<=100; $i++) if($i % 7 == 0) echo $i . "<br>"; 
2

你可以用它來簡單的事情,如:

if($a === true) continue; 

但對於一些更復雜分條件它可能會導致你的問題:

$a = false; 
    $b = false; 
    if ($a === true) 
     if ($b === true) 
      echo 1; 
    else 
     echo 2; 

有了上面的代碼,你會期望看到「2」作爲輸出,但你不會。

5

正如你所說的你不想了解速記的和接受的答案給出了一個很好的例子,關於省略curly braces,但有一些補充。正如你所看到的,在if ($x) echo 'foo';的情況下可省略curly braces。代碼沒有問題,沒有性能或其他問題,並且其他開發人員可讀。和例子也說明你,如果你寫

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

,而不是

if ($x) 
    echo 'foo'; 

echo 'bar'; 

你可以碰到,而你不希望它被印刷出來,其中bar打印,如果你的代碼是不想要的結果充滿了這樣的陳述,那麼它會讓你更難閱讀你自己的代碼,而更難讓別人閱讀它。

我不想了解簡寫的我只是想了解何時何地可以省略大括號的條件。

這些東西是密切相關的,所以如果你真的想明白的地方,可以省略大括號那麼這應該是你瞭解或者至少知道速記公司的一絕,已閱讀

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

所以我最大的問題是:我什麼時候可以省略CUR大括號和在哪個結構/循環/功能?

然而,爲了便於閱讀和維護,大括號並不是必需的,許多開發人員會認爲它不包含它們的糟糕風格。以前的2個鏈接應該爲您提供所需的信息,以便您可以省略大括號時作出自己的決定。例如 下面的代碼片段沒有什麼不對,它們都做同樣的事情。

用花括號

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

是一樣

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

或者你也可以使用點運算符

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

你可以使用三元條件運算符,甚至忽略if它自身除了省略花括號

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

因爲我們只打印,我們可以縮短這一點,剝離一些print string functions這是在這裏代表超過在聲明一個功能,無需花括號

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

作爲從PHP 7我們可以使用空合併運算符

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

正如人們可以看到有很多方法可以得到完全相同的結果。這不僅適用於此if示例,但可以與structure/loop/function一樣實施。所以沒有人回答你的大問題。主要應該考慮以下幾點。

  1. 您寫的代碼是否易於維護。
  2. 你可以回答你的自我是否有你通過省略大括號而獲勝。
+0

嗯,我不知道他們向貓王操作員添加了一個空合併操作符...整潔。但運算符的哪一邊是空的,它是否允許在條件塊中取消設置變量? – Ber 2016-06-21 05:03:55

+1

'$ I_want_value = $ if_im_not_null_use_me ?? $ if_first_is_null_use_me ?? $ if_second_is_null_use_me;'因此,如果前一個變量爲NULL,那麼您可以擁有與您一樣多的替代方案; [PHP 7新功能](http://php.net/manual/en/migration70.new-features.php) – 2016-06-21 14:14:22

+0

有趣的,所以它是一個無限的運算符......但它對未定義的變量有效嗎?我會檢查文檔。我認爲這是擁有一個空合併運算符的唯一目的,否則爲什麼不使用Elvis。 ?:) – Ber 2016-06-22 04:27:47

1

要補充@Marko的回答,請注意,在使用點運算符處理此問題時,應將每個操作括在括號內,否則將顛倒順序。

例如,下面的這段代碼將打印PHP >= 7.0 required yours is 5.6.15

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

雖然這會打印5.6.151PHP >= 7.0 required yours is 1

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

您也可以使用and運營商爲此工作。像這樣:

if (PHP_VERSION_ID < 70000) 
    print("PHP >= 7.0 required yours is ") and 
    print(phpversion()) and 
    print("\n");