第3週


制御構文

変数の作成

先週の宿題。
結論としては、山口さんが正しかったです。

参考
変数の作成(PHPマニュアル第46章)

また、いろいろ調べている中で
変数の代入について書いてあったページがあったので、載せておきます。

参考
変数の代入は、値のコピーにあらず-PHP変数管理

構造化プログラミング

プログラミングの構文は以下の3つに大別できる。

  • 順次(順節、順構造)
  • 選択
  • 反復

これらを組み合わせながらプログラミングしていくことを
構造化プログラミングという
PHPも例外ではなく構造化プログラミングのための制御構文を標準で提供している

条件分岐(選択)

if文

if文の構文

if ( 条件式 ) {
    // 条件式がtrueの場合に実行する処理
}
if ( 条件式 ) {
    // 条件式がtrueの場合に実行する処理
} else {
  // 条件式がfalseの場合に実行する処理
}
if ( 条件式1 ) {
    // 条件式1がtrueの場合に実行する処理
} elseif ( 条件式2 ) {
    // 条件式2がtrueの場合に実行する処理
}
…
} else{
  // 条件式1、2…がいずれもfalseの場合に実行する処理
}

サンプル1


三項演算子で書き換え可能

サンプル2

中カッコは省略可能

サンプル3

switch文

switch文の構文

switch ( 式 ) { 
    case 値1:
        // 「式 = 値1」の場合に実行する処理
    break;
    case 値2:
        // 「式 = 値2」の場合に実行する処理
    break;
…
    default:
        // 式の値が1、2、…のいずれでもない場合に実行する処理
    break;
}

サンプル4

尚、「defaultsは省略可能」ですが
どのcaseブロックにも合致しなかった挙動をあいまいにしないためにも、
省略しないようにしましょう。

フォールスルー

意図的にbreak文を省略して、複数のブロックを続けて実行する書き方

サンプル5

switch文の判定方法

switch文は式と値の比較を「==」演算子で行う。
「===」演算子での比較ではないので、データ型に関しては寛容であるため、 注意が必要な場合がある

サンプル6


if文とのパフォーマンスの比較

switch文は、if文よりも若干だがパフォーマンスがよいというメリットがある。
これはif〜elseif文は個々の条件式をそれぞれ評価するが、
switch文では先頭の式を1度しか評価しないから。

繰り返し処理(反復)

while文 / do〜while文

while文の構文

while ( 条件式 ) {
    // 条件式がtrueである限り繰り返し実行する処理
}

do〜while文の構文

do {
    // 条件式がtrueである限り繰り返し実行する処理
} while ( 条件式 ) 

サンプル7

while文、do〜while文の違い

結果だけを見ると、while文もdo〜while文も同じ動きをしているように見える。
しかし、while文がループの先頭で判定をする(前置判定)のに対し、
do〜while文はループの最後に判定する(後置判定)。

後置判定は条件に関わらず必ず1回はループが実行されるが、 前置判定では、条件次第では1回もループが実行されないことがある。

for

for文の構文

for ( 初期化式; ループ継続条件式; 増減式 ) {
    //ループ内で実行する処理
}

サンプル8

これは正しい書き方。
PHPは以下のような式でも実行してしまい、無限ループになる。

for ( $i=1; ; $i++) { 〜 }   //ループ継続条件式を省略
for ( ; ; ) { 〜 }           //全ての式を省略

ループ継続条件式が省略されると、for文は無条件にtrueとなみなすため。


カンマ演算子

カンマを利用することで、初期化式、ループ継続条件式、増減式に複数の式を指定することもできる。

サンプル9

foreach文

foreach分の構文
foreach ( 配列 as 値変数 ) { 
    //ループ内で実行する処理
}
foreach ( 配列 as キー変数 => 値変数 ) { 
    //ループ内で実行する処理
}

サンプル10

値変数の参照渡し

サンプル11

ループの制御

while、do〜while、for、foreach文では、あらかじめ決められた終了条件を満たしたタイミングでループを終了する。
しかし、処理によっては終了条件に関わらず、特定の条件を満たしたところで強制的にループを中断したい場合がある。
そのような場合には、ループを制御するbreak、continueを使う。

break、continue

  • braek:現在のループを強制的に中断させるループ
         ループそのものを完全に抜ける
  • continue:現在の周回だけをスキップする

サンプル12


ループのネスト時のbreak、continue

ネストされたループの中でbreak、continueは
デフォルトでは最も内側のループを脱出、スキップする。

以下のような構文で、脱出、スキップする階層を指定できる。

break ループ階層
continue ループ階層

サンプル13

switch文の中でのcontinue

switch文の中では、continueはbreakと同じ動きをする。

サンプル14

※switch文は挙動の上では条件分岐構文だが、
 PHPの中では繰り返し構文として扱われる

その他の制御文

他にも、return、require、include、try〜catchなどの命令制御文があるが、
これらはまた後日扱う

goto文

goto文を使うことによって、スクリプトの処理を他に移動することができる。

for ($i=1; $i<=10; $i++) {
    for ($j=1; $j<=10; $j++) {
        $result = $i * $j;
        if ($result > 40) { goto end; }
        echo "{$result} &nbsp;";
    }
    echo "<br />";
}
end:

※ただし、goto文はどこにでも移動できるわけではない  以下のような場合には使えない

  • 異なるファイルには移動できない
  • 関数やクラス・メソッドの中には移動できない
  • ループの外から、ループの中には移動できない

※PHP5.3から対応

制御文の別構文

サンプル16


参考資料