ブログ
8.172016
WordPress でよく使われる PHP の条件分岐と反復の命令の記述方法
PHPで実装されているWordPressですが、PHPをバリバリ使いこなすエンジニアが逆に最初に躓いてしまうのが条件分岐や反復の記述のルール。特にテーマなどで多く使われる記述は、最初一瞬「???」となり妙にハマってしまう箇所でもあります。
通常は PHP の一般的なリファレンスには「{ }」を用いたブロック形式(と、インデントによるソースコードの可読性の確保の方法)しか紹介がありませんが、よく WordPress ではテーマを中心に別の表記を用いている場合が多くなっています。
では具体的にどのように違い、どのように定義されているか、という点について紹介します。
結論
- if、while、for、foreach とその必要な条件式等の記述の後で、「:」(コロン)を記述し、そこからブロックが始まることを示す
- if、while、for、foreach などの条件分岐や反復の最終端に、それぞれ end を付けた endif、endwhile、endfor、endforeach を記述し、そこが終わりであることを示すために「;」(セミコロン)を付ける
- ifに対するelseやelseifなども同様に、必要な記述の後に「:」(コロン)を記述し、そこからブロックが始まることを示す
- 従来のブロック内の構文は、これまで通り普通に記述します
簡単に置き換えができるように表現しなおすと、「{」を「:」に置き換え、「}」は、最も最後のもののみ、end○○; とし、それ以外の「}」は削除します。
具体的な使い方を見たいという方のために、言語ではよくある関数等の表記パターンに従って、それぞれ書き起こしましたので参考にされてください。
制御構造に関する別の構文 http://php.net/manual/ja/control-structures.alternative-syntax.php
if文
if (条件式) : endif;
if (条件式) : elseif (条件式) : else: endif;
while文
while (継続条件) : endwhile;
for文
for (初期値; 継続条件; 増減式) : endfor;
foreach文
foreach (配列 as 値を入れる変数) : endforeach;
foreach (配列 as キーを入れる変数 => 値を入れる変数) : endforeach;
番外編:三項演算子(?:演算子)
三項演算子は ○ ? △ : □ 形式で表記される演算子になります。(「?」や「:」はもちろん半角です。)
この表記は他の表現はありませんので、PHP を熟知された方は特に違和感なく使えると思いますが、一方で PHP 初心者にとっては謎な文法に見えてしまいます。
たとえば、使用例として以下のような表記があります。
$msg = ($ret = 1) ? 'Yes' : 'No'; $msg2 = $x ? 1 : 0;
見分け方のコツは、文法中に突然「?」が現れている箇所があるかどうかです。
突然「?」が出現し、かつ、たとえば「’」(シングルクォート)や「”」(ダブルクォート)で囲まれておらず、コメントの範囲内でもない場合は、たいてい三項演算子と疑って良いでしょう。
三項演算子だと疑ったなら、答え合わせは簡単です。行末(それ以降で「;」がある箇所まで、改行が挟まれても構わない)までの範囲内に「:」(コロン)があるかどうかで見分けることが可能なのです。
三項演算子の役割は、ざっくりと言えば、ひとつの計算式と同じような効果をもつ条件分岐の亜種のようなもので、「?」の前の条件式が成立する場合は「:」の前に指定された内容を、合致しない場合は「:」の後に指定された内容を返すという機能になっています。
上記の使用例であれば、1行目は $ret が 1 であれば Yes という文字列を、それ以外であれば No という文字列を $msg に代入します。2行目については、$x が 0 以外の値であれば 1 を、それ以外の値であれば 0 を $msg2 に代入します。
また、今回は代入での使用例のみでしたが、比較条件式としても(珍しいと思いますが)可能性としてはないわけではありません。どこかで突然現れて、慣れるまでは「???」となるのが三項演算子。簡素に実装するために用いる事が多いのも事実ですので、ソースを見る機会がある方は、少し気に留めておくと良いでしょう。
三項演算子 http://php.net/manual/ja/language.operators.comparison.php#language.operators.comparison.ternary
Copyright © PLUGMIZE(プラグマイズ)