PHP/条件分岐
条件分岐[編集]
プログラミング言語は、丁度楽譜のように左から右、上から下に実行します。 しかし、PHPの最初の目的が静的なHTMLをサーバー側で動的に生成することだったことを思い出しましょう。
次の例は、時刻によって表示するメッセージを変えています。
- 時刻によって表示するメッセージを変える例
<?php $hour = localtime(null, true)["tm_hour"]; ?> <?php if ($hour < 6 or $hour > 17): ?> <p>こんばんは。</p> <?php elseif ($hour < 10): ?> <p>おはようございます。</p> <?php else: ?> <p>こんにちは。</p> <?php endif; ?>
- 実行結果(0時から6時までと17時から24時まで)
<p>こんばんは。</p>
- 実行結果(6時から10時まで)
<p>おはようございます。</p>
- 実行結果(それ以外は)
<p>こんにちは。</p>
- このように、生成するHTMLを動的に変更する場合、if文などによる条件分岐が活躍します。
3つの分岐構文[編集]
PHPには、if, switch, match の3つの分岐構文があります。
if[編集]
PHPには、C風のifがあります。else if
の短縮構文があるほか、テキストに埋込むのに適した代替構文があります。
例:
<?php
$n = NAN;
// 基本構文
if ($n < 0) {
echo '$n < 0', PHP_EOL;
} elseif ($n > 0) {
echo '$n > 0', PHP_EOL;
} elseif ($n == 0) {
echo '$n < 0', PHP_EOL;
} else {
echo $n, PHP_EOL;
}
echo PHP_EOL;
// 代替構文
if ($n < 0):
echo '$n < 0', PHP_EOL;
elseif ($n > 0):
echo '$n > 0', PHP_EOL;
elseif ($n == 0):
echo '$n < 0', PHP_EOL;
else:
echo $n, PHP_EOL;
endif;
?>
<?php if ($n < 0): ?>
<?= '$n < 0' ?>
<?php elseif ($n > 0): ?>
<?= '$n < 0' ?>
<?php elseif ($n == 0): ?>
<?= '$n == 0' ?>
<?php else: ?>
<?= $n ?>
<?php endif; ?>
- 基本構文
if ( 条件1 ) 文1 else if ( 条件式2 ) 文2 elseif ( 条件式3 ) 文3 … else 文
else if
はelse if
のシノニムでそれぞれ0回以上繰り返せる。else 文
は省略可能。- 代替構文
if ( 条件式1 ): 文1 elseif ( 条件式2 ): 文2 ︙ else: 文 endif;
- 代替構文では
else if
は使えない - 埋込構文
<?php if ( 条件1 ): ?> テキスト1 <?php elseif ( 条件式2 ): ?> テキスト2 <?php elseif ( 条件式3 ): ?> テキスト3 ︙ <?php elseif ( 条件式n ): ?> テキストn <?php else: ?> テキスト <?php endif; ?>
switch[編集]
PHPには、C風のswitchがあり、フォールスルーの挙動などほとんど同じですが、case の式に定数式以外の式が使える他、文字列などの比較も「緩やかな比較」で行えます。
- 例
<?php $s = "as"; switch ($s) { case "abstract": echo "KW_abstract", PHP_EOL; break; case "and": echo "KW_and", PHP_EOL; break; case "as": echo "KW_as", PHP_EOL; break; case "break": echo "KW_break", PHP_EOL; break; default: echo "Unknown"; } echo PHP_EOL; switch ($s) : case "abstract": echo "KW_abstract", PHP_EOL; break; case "and": echo "KW_and", PHP_EOL; break; case "as": echo "KW_as", PHP_EOL; break; case "break": echo "KW_break", PHP_EOL; break; default: echo "Unknown"; endswitch; ?> <?php switch ($s) : ?> <?php case "abstract":?> <?= "KW_abstract", PHP_EOL;?> <?php break;?> <?php case "and":?> <?= "KW_and", PHP_EOL;?> <?php break;?> <?php case "as":?> <?= "KW_as", PHP_EOL;?> <?php break;?> <?php case "break":?> <?= "KW_break", PHP_EOL;?> <?php break;?> <?php default:?> <?= "Unknown";?> <?php endswitch; ?>
- 実行結果
- C風のswitchで、もし
break
がないと次のcase
以降も実行します。 - 基本構文
switch ( 式 ) { case 式1 : 文1 case 式2 : 文2 ︙ case 式n : 文n default : 文 }
- 代替構文
switch ( 式 ) : case 式1 : 文1 case 式2 : 文2 ︙ case 式n : 文n default : 文 endswitch ;
- 埋込構文
<?php switch ( 式 ) : ?> <?php case 式1 : ?> テキスト1 <?php case 式2 : ?> テキスト2 ︙ <?php case 式n : ?> テキストn <?php default:?> テキスト <?php endswitch; ?>
match[編集]
PHPのmatchは、switchと似ていますが、文ではなく式なので値が取れるほか、比較には「厳密な比較」が使われます。
matchには、代替構文も埋込み構文もありません。
- 例
<?php $s = "as"; echo match ($s) { "abstract" => "KW_abstract", "and" => "KW_and", "as" => "KW_as", default => "Unknown", }, PHP_EOL; ?>
- #switchの例と同じロジックです。簡素にかけていますが、
- 連想配列を使った実装
<?php $s = "as"; echo [ "abstract" => "KW_abstract", "and" => "KW_and", "as" => "KW_as", ][$s] ?? "Unknown", PHP_EOL; ?>
- と書いたほうがより簡素だと考えるひともいるでしょう。
- また、
=>
の右には「式」が要求されるので、echo
のようなコマンドは使えません。 - 厳密でない比較の使用
<?php $age = 18; echo "{$age}歳は", match (true) { $age < 1 => "乳児", $age < 6 => "幼児", $age < 18 => "少年", default => "成人", }, "です。", PHP_EOL; ?>
- こんな事もできます。
- 基本構文
- 代替構文
- (ありません)
- 埋込構文
- (ありません)
2つの比較演算子[編集]
if や while なでの条件式で、使われる比較演算子には2種類あります。
==
- 型を厳格には区別しない「緩やかな比較」
===
- 型を厳格に区別する「厳密な比較」
なお、=
等号1個は単なる代入命令ですが条件式で使われると代入された値を真理値として評価されます。
緩やかな比較[編集]
==
は、型を厳格には区別しない「緩やかな比較」演算子です。
<?php $a = 1; if ($a == 1) { echo "整数:", PHP_EOL; var_dump($a, 1) ; } if ($a == 1.0) { echo "浮動小数点数:", PHP_EOL; var_dump($a, 1.0) ; } if ($a == "1") { echo "文字列:", PHP_EOL; var_dump($a, "1") ; } ?>
- 実行結果
整数: int(1) int(1) 浮動小数点数: int(1) float(1) 文字列: int(1) string(1) "1"
- すべて一致します。
厳密な比較[編集]
===
は、型まで一致していることを要求する「厳密な比較」演算子です。
<?php $a = 1; if ($a === 1) { echo "整数:", PHP_EOL; var_dump($a, 1) ; } if ($a === 1.0) { echo "浮動小数点数:", PHP_EOL; var_dump($a, 1.0) ; } if ($a === "1") { echo "文字列:", PHP_EOL; var_dump($a, "1") ; } ?>
- 実行結果
整数: int(1) int(1)
- 型の一致は、数値であるだけでは不十分で、整数か浮動小数点数かは区別しています。
値または型の不一致演算子[編集]
!==
は型まで一致していない、あるいは値が一致していないと真をかえす演算子です。
Webアプリケーション向けの機能[編集]
PHPは、Webアプリケーションの開発に広く使用されているプログラミング言語の1つです。
以下は、PHPのWebアプリケーション開発に役立つ機能のいくつかです。
- フォーム処理: PHPは、HTMLフォームから送信されたデータを処理するための強力な機能を提供します。 $_POST、$_GET、$_REQUESTなどの変数を使用して、フォームからの入力データにアクセスできます。
- データベース接続: PHPは、MySQL、PostgreSQL、Oracleなどの多くのデータベースにアクセスするための豊富な機能を提供します。データベースへの接続、データの取得、更新、削除などを実行することができます。
- セッション管理: セッションは、Webアプリケーションのユーザーが同じブラウザで複数のページを閲覧する際に、情報を保持するために使用されます。PHPは、セッションを開始、管理、破棄するための関数を提供しています。
- ファイルアップロード: ユーザーがWebアプリケーションにファイルをアップロードすることができるようにする場合、PHPは、ファイルアップロードの処理を容易にする関数を提供しています。
- メール送信: PHPは、SMTPサーバーを使用してメールを送信するための関数を提供しています。これにより、Webアプリケーションから自動送信メールを送信することができます。
- セキュリティ: PHPは、Webアプリケーションのセキュリティに役立つ多数の関数を提供しています。例えば、SQLインジェクション、クロスサイトスクリプティング(XSS)、クロスサイトリクエストフォージェリ(CSRF)などの攻撃を防ぐための関数があります。
- API開発: PHPは、RESTful APIを開発するための機能も提供しています。これにより、Webアプリケーションからデータを提供するAPIを作成することができます。
以上が、PHPのWebアプリケーション開発に役立つ機能の一部です。
フォーム処理[編集]
データベース接続[編集]
セッション管理[編集]
PHPには、Webアプリケーションでセッション管理を行うための機能があります。セッションとは、ユーザーがWebサイトにアクセスしてからブラウザを閉じるまでの期間における、ユーザーの情報や状態を保持するための仕組みです。PHPのセッション管理機能を使うことで、ユーザーの認証やページ間でのデータのやり取りなどを簡単に実現できます。
PHPのセッション管理には、以下のような機能があります。
- セッションの開始と終了 — session_start()関数を使ってセッションを開始し、session_destroy()関数を使ってセッションを終了します。
- セッションデータの設定と取得 — $_SESSION変数を使って、セッションにデータを設定したり、取得したりできます。例えば、以下のようにして、ユーザーIDをセッションに設定し、取得することができます。
- セッション開始 session_start();
- セッションにユーザーIDを設定 $_SESSION['user_id'] = 123;
- セッションからユーザーIDを取得 $user_id = $_SESSION['user_id'];
- セッションの有効期限の設定 — session_set_cookie_params()関数を使って、セッションの有効期限を設定することができます。デフォルトでは、ブラウザを閉じるまでセッションが継続しますが、この関数を使うことで、期限を設定することができます。
- セッションの安全性の向上 — セッションIDを盗まれると、不正なアクセスがされる可能性があります。そのため、セッションIDをランダムに生成するように設定することが推奨されています。また、SSLを使うことで、通信内容を暗号化し、セッションの安全性を向上することができます。
以上が、PHPのセッション管理についての概要です。セッションを使うことで、Webアプリケーションの機能を拡張し、セキュリティを向上させることができます。