オープンソースのWeb開発向けスクリプト言語「PHP」の文法を一から学ぶための入門連載。今回は、PHPにおけるif、else、elseif、switch、case、default、breakの使い方に加え、真偽値、論理型と比較演算子、インデントなどについて解説します【PHP 7.1含め2017年の情報に合うように更新】。
オープンソースのWeb開発向けスクリプト言語「PHP」の文法を一から学ぶための入門連載「Web業界で働くためのPHP入門」。前回の「PHPの変数と代入、リテラルとエスケープシーケンス」では、変数とリテラルなどについての基礎を解説しました。このテーマで覚えるべき点はまだありますが、似たようなテーマを続けても退屈ですから、今回は話題を変えて条件分岐について解説します。
PHPでは、コードはファイルの先頭から順に文が実行されます。しかし順に実行するだけでは状況に応じた処理ができません。そこで、コードの流れを変えるための、「制御構文」といわれるものが必要になります。この制御構文の代表格が今回解説する「条件分岐」と、「ループ(繰り返し)」です。
極論になりますが、これらの制御構文に加えて、PHPに備わっているさまざまな機能をマスターすれば、品質はさておき、ほとんどのプログラムは作ることができるでしょう。単純に動かすだけであれば必要な文法というのは意外と少ないものです。多くはコードの読みやすさ、品質、生産性などを向上するための要素といえます。
条件分岐とは、「変数や値との比較の結果によって、文を実行する、あるいはしない」というものです。これには、if文とswitch文の2種類があります。基本となるのはif文なので、if文から解説を始めることにしましょう。
まず、if文を使った例を見ていきましょう。
<?php $foo = 123; if($foo == 123) { print("fooの値は123です<br>"); } print("処理終了!");
実行結果は以下の通りです。
fooの値は123です 処理終了!
この例では、変数「$foo」の値が「123」であればメッセージを表示し、そうでなければ何もしない、という動作になります。「==」は値が等しいかどうかを比較する記号です(この記号に関しては後述します)。ifは、その次の( )内に条件を記述し、その条件が正しい場合に{ }内の文が実行される仕組みです。
ここで、2行目の$fooの値を123以外に変更して再実行してみてください。その際、下記のように表示されることが確認できると思います。
処理終了!
ifでは、( )内の条件が正しい時にだけ{ }ブロック内が実行されますが、あくまで実行されるのは、{ }ブロック内の処理だけです。そのため、{ }の外側に記述されている下記は条件にかかわらず常に実行されているのが確認できたと思います。
print("処理終了!");
ここで、ifを構文化しておきましょう。
if(条件) {
条件が正しいときに行う処理
}
条件が真のときに実行する文の先頭に空白があります。これを「インデント」または「字下げ」といいます。この空白はコードを見やすくするためのもので、なかったとしても文法的には何ら問題はありません。
インデントは、タブで行う方法と、半角スペースを幾つか入力する方法の2種あります。半角スペースを使う場合も、2個のパターンや4個のパターンなどがあります。
PHPでは、半角スペース4個を使うのが標準とされています。ただし、社内規約、あるいは、プロジェクト規約として決まっている場合もありますので、その場合はそれに従います。
また、波かっこの開始位置についても同様で、下記のようにifに続けて書くパターンと、
if(…) {
下記のように次の行から始めるパターンとがあります。PHPでは、前者が一般的です。
if(…) {
なお、インデントも、カッコの位置も、プログラムの実行には全く影響しません。あくまでソースコードを見やすくするためのものです。しかし、このソースコードの見やすさというのは、プログラマーにとっては非常に大切なものですので、常に心掛けるようにしてください。
ifの条件には、真(true)または偽(false)という結果を返すような式が入ります。この真および偽の値を「真偽値」「論理値」などといいます。前回、データには数値や文字列といった「型」が存在すると述べましたが、真偽値も型の1つで、「論理型」「boolean(ブーリアン)」といいます。
真偽値についてもリテラルが存在します。真は「true」、偽は「false」です。実際のところ、大文字小文字は区別されませんが、全て小文字で書くのが標準です。例えば、以下のような記述です。
$foo = true; $bar = false;
なお、クオートは不要です。クオートしてしまうと、ただの文字列型になってしまいますので注意してください。
ちなみに、これら真偽値のリテラル、ifやswitch、break(後述)といった言語として規定されている語などは「予約語」と言いますが、大文字小文字を区別しません。ですが、予約語は全て小文字で書くのが標準です。
先述の通り、「==」という記号は、左右の値を比較して等しければ真を返す演算子です(演算子については前回の「PHPにおける変数への格納の仕方と代入演算子」を参照)。ここで注意してほしいのは、イコールを2個並べている点です。繰り返しになりますが、数学では「=」が「値が同じ」を表しますが、PHPでは「代入」です。そこで、「==」とイコールを2個並べるのです。
ここを間違えて、下記のようにイコール1個と記述してはいけません。
if($foo = 123)
( )内の下記は、「変数fooに123を代入する」という意味なので、常にtrueとなってしまいます(もちろん、期待した結果は得られません)。
$foo = 123
このように値を比較して真偽値を返す演算子を「比較演算子」といいます。if文の条件には、主に、このような比較演算子が使われます。
比較演算子には、主に次のようなものがあります。
記号 | 意味 |
---|---|
== | 値が等しければ真 |
!= | 値が等しくなければ真 |
< | 右側が大きい場合に真 |
> | 左側が大きい場合に真 |
<= | 右側が大きいか等しい場合に真 |
>= | 左側が大きいか等しい場合に真 |
これらの比較演算子の左右で、異なる型を使ったらどうなるでしょうか。例えば「"abc" == 123」などです。この例ではもちろん等しいわけはなく、結果は偽になります。では「"123" == 123」だとしたらどうでしょうか?
実は、この結果は真になります。PHPでは、前述の比較演算子を使った場合、自動的に型が変換されて数値として比較されるのです。こういった変換は頻繁に発生するため、便利な機能なのですが、その一方で比較の内容によっては意図しない動作を招くことがあります。
もし、型も含めて同じかどうかを区別する場合は、「===」とイコールを3個使った演算子を使います。「"123" == 123」は真となりますが、「"123" === 123」は偽となります。
比較演算子はif文だけでしか使えないわけではありません。例えば、次のように比較演算子の結果を代入することも可能です。
<?php $foo = 123; $bar = $foo == 123; if($bar) { print("fooの値は123です<br>"); } print("処理終了!");
実行結果は、リスト1と同じです。
このように、if文の条件として、論理型の値が入っている変数をそのまま使うこともできます。例えば、比較した結果を何回かif文で使いたい、といった場合などですっきりと書くことができます。
Copyright © ITmedia, Inc. All Rights Reserved.