63445


1行if文は[公式ドキュメント](https://www.php.net/manual/ja/control-
structures.if.php)のどこに掲載されていますか？

1行if文は波括弧を省略して1行で書くこともできる、と思っていたのですが、  
elseがないif文は全て波括弧を省略できる、のですか？

elseがないif文は波括弧を省略できる、だから、1行if文はelseがないから波括弧を省略できる、ということですか？


CC BY-SA 4.0
2020-02-28T22:58:53.750
63443
2020-02-29T01:45:06.560
7886
question
php
if文の波括弧を省略できる要件について


そもそも「1行if文」と言う概念は、PHP(あるいは同等のC由来の構文を採用した言語)にはありません。

あなたが「1行if文」と呼んでいるのであろう構文はあなたがリンクされたページにはっきり書かれています。

[code]

    if (式)
      文
    
[/code]

「1行if文は波括弧を省略して1行で書くこともできる、と思っていた」と言うのが間違いです。if文の条件部の後には「１つの文」を書くことができます。1行で書くかどうかにかかわらず波カッコは必須ではありません。

PHPにおいては、

[code]

    $a = "xyz";
    
[/code]

のように「式の後ろに`;`を付けたもの」も「１つの文」ですし、

[code]

    {
        $a = "xyz";
        print($a);
    }
    
[/code]

のように複数の文を波カッコで囲んだものも「１つの文」です。

したがって、複数の文の実行を同じ条件で制御したい場合には、必然的に波カッコを使わざるを得ないのですが、一つの文で良い場合には波カッコは必要としません。(読みやすさや保守性の観点から使うべきかどうかはまた別の問題で。)

* * *

したがって「elseがないif文」かどうかにかかわらず、条件付きで実行されるのが「１つの文」であれば、波カッコは必要ありません。


CC BY-SA 4.0
2020-02-28T23:14:36.687
63445
2020-02-28T23:14:36.687
13972
63443
answer


@OOPer さん回答の補足になると思います。

公式ドキュメントだと、[if](https://www.php.net/manual/ja/control-structures.if.php) や
[式](https://www.php.net/manual/ja/language.expressions.php)
は明示的なタイトルのあるページがあって判りやすいですが、`文`はそれがありません。

探すと`制御構造`の`はじめに`に書いてある内容が`文`の説明にあたるようです。紛らわしいですね。  
PHPの方は全文を引用します(太字は引用者)が、もう一つのリンク先の説明を組み合わせると、質問の状況になるでしょう。

[PHP: はじめに - Manual](https://www.php.net/manual/ja/control-
structures.intro.php)

> はじめに  
>  **すべての PHP スクリプトは、一連の文からなります。** 文としては、代入、関数コール、ループ、条件文、そして何もしない文(空の文)
> さえ使用することができます。 **文は、通常セミコロンで終了します。** 加えて、 **文は、中括弧によるグループ文で
> カプセル化することによりグループ化することが可能です。 グループ文は、同時に文にもなります。** 本章では、様々な文の型について説明します。

[2019年度「プログラミング言語」配布資料
(14)](http://www.fos.kuis.kyoto-u.ac.jp/~igarashi/class/pl/14-language-
syntax.html)

> 空白文字  
>  空白文字(blank
> characters)は，トークン間の区切りを明示する役割は果たすが，構文解析の段階では無視する(トークンとして現れない)ことが多い．この講義で扱った言語では，
> **スペース，タブ，改行文字は一括して空白文字として扱われ全て構文解析の段階では無視されるので，改行をスペースに置き換えたり，その逆をしてもプログラムとしては全く同じく扱われる．**
> (字句・構文解析技術が成熟していなかった頃の)古いプログラミング言語では，行が特殊な意味を持つものも多い．また，逆に最近の言語(Haskell,
> Pythonなど)では，ひと固まりの処理(C言語, Java での {}
> で表されるブロック)などを表すために，括弧などの記号ではなく，字下げ(行頭からの空白の)量を利用するものもあり，そういった言語ではスペースと改行は厳密に区別される．また，エディタ上では何も表示されないのに空白文字ではない，という文字(典型的にはいわゆる全角スペース)もありうるので注意が必要である．

* * *

  * PHPスクリプトは`文`が集まったもの
  * `文`はセミコロンで終了する(区切られる)
  * 中括弧(波括弧)の中に複数の文を入れてグループ化したものも1つの文として扱われる
  * `if構文`は、`if`に続く`括弧で囲まれた1個の式`と、それに続く`1個の文`で構成される
  * 構文解析上、スペース/タブ/改行文字は一括して空白文字として扱われる言語がある(PHPはこれに属するようです)  
[PHP: パーサトークンの一覧 - Manual](https://www.php.net/manual/ja/tokens.php)

ということで、ifの説明にあった以下のものは、

[code]

    if (式)
      文
    
[/code]

こちらと等価になるでしょう。

[code]

    if (式) 文
    
[/code]

そしておそらく中括弧(波括弧)が使われても1行で書けるものと思われます。(ですよね？)  
まあこんな風に書く人はほぼ居ないでしょうけど。

[code]

    if (式) { 文 文 文 文 }
    
[/code]

* * *

ちなみに8年前の投稿で Down Vote されてますが、こんなコメントが [PHP: else -
Manual](https://www.php.net/manual/ja/control-structures.else.php) にありました。  
@OOPerさんの「したがって「elseがないif文」かどうかにかかわらず、条件付きで実行されるのが「１つの文」であれば、波カッコは必要ありません。」の例でしょう。

[php at keith tyler dot com](https://www.php.net/manual/ja/control-
structures.else.php#104753)

> This is valid syntax:
[code]

>     <?php
>     if ($a) print "a is true";
>     else print "a is false";
>     ?>
>  
[/code]

>
> A holdover from the bash-style compatibility in older PHP versions, perhaps.
>
> これは有効な構文です:  
>  おそらく、古いバージョンのPHPのbashスタイルの互換性からの名残りです。


CC BY-SA 4.0
2020-02-29T01:45:06.560
63448
2020-02-29T01:45:06.560
26370
63443
answer