「PHP/Webアプリケーション向けの機能」の版間の差分
削除された内容 追加された内容
→シンプルでダーティーなログインフォーム: URI間違え タグ: 2017年版ソースエディター |
→3つの分岐構文: PHPには、if, switch, match の3つの分岐構文があります。 タグ: 2017年版ソースエディター |
||
25 行
:このように、生成するHTMLを動的に変更する場合、if文などによる条件分岐が活躍します。
== 3つの分岐構文 ==
PHPには、[[#if|if]], [[#switch|switch]], [[#match|match]] の3つの分岐構文があります。
=== if ===
;コード例:<syntaxhighlight lang=php>
<?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; ?>
</syntaxhighlight>
;基本構文:<syntaxhighlight lang=php>
if ( 条件1 ) 文1 else if ( 条件式2 ) 文2 elseif ( 条件式3 ) 文3 … else 文
</syntaxhighlight>
: <code>else if</code>は<code>else if</code>のシノニムでそれぞれ0回以上繰り返せる。
: <code>else 文</code>は省略可能。
;代替構文:<syntaxhighlight lang=php>
if ( 条件式1 ):
文1
elseif ( 条件式2 ):
文2
︙
else:
文
endif;
</syntaxhighlight>
:代替構文では<code>else if</code>は使えない
;埋込構文:<syntaxhighlight lang=php>
<?php if ( 条件1 ): ?>
テキスト1
<?php elseif ( 条件式2 ): ?>
テキスト2
<?php elseif ( 条件式3 ): ?>
テキスト3
︙
<?php elseif ( 条件式n ): ?>
テキストn
<?php else: ?>
テキスト
<?php endif; ?>
</syntaxhighlight>
=== switch ===
;コード例:<syntaxhighlight lang=php>
</syntaxhighlight>
;基本構文:<syntaxhighlight lang=php>
</syntaxhighlight>
;代替構文:<syntaxhighlight lang=php>
</syntaxhighlight>
;埋込構文:<syntaxhighlight lang=php>
</syntaxhighlight>
=== match ===
;コード例:<syntaxhighlight lang=php>
</syntaxhighlight>
;基本構文:<syntaxhighlight lang=php>
</syntaxhighlight>
;代替構文:<syntaxhighlight lang=php>
</syntaxhighlight>
;埋込構文:<syntaxhighlight lang=php>
</syntaxhighlight>
== 条件分岐以外の話題 ==
=== シンプルでダーティーなログインフォーム ===
;login.php:<syntaxhighlight lang="php" line>
<!DOCTYPE html>
121 ⟶ 210行目:
</syntaxhighlight>
==
if や while なでの条件式で、使われる比較演算子には2種類あります。
; <code>==</code>:型を厳格には区別しない「緩やかな比較」
; <code>===</code>:型を厳格に区別する「厳密な比較」
なお、<code>=</code>イコール1個は単なる代入命令ですが条件式で使われると代入された値を真理値として評価されます。
=== 緩やかな比較 ===
等号2個の<code>==</code>で評価した場合、
下記コード、
:<syntaxhighlight lang=
<?php
$a = 1; //
if ($a == 1) {
}
if ($a == "1") {
}
?>
</syntaxhighlight>
;実行結果
<pre>
数字
文字列
</pre>
:両方の場合でヒットしてしまいます。
このように、数値として定義したつもりの変数が文字列としても解釈されたりする仕様は、便利な場合もありますが、ときには予想外の動作を引きおこすので使いたく無い場合もあります。そこで、下記のように、イコール3個の厳密な判定を行う等価演算子が用意されています。
175 ⟶ 250行目:
イコールの比較のさいの、型についての予想外の動作を防ぐための、より厳密な比較をできるイコール3個の演算子があります。
if文などでの比較の際、
:<syntaxhighlight lang=
<?php
198 ⟶ 273行目:
</pre>
このように、
* 余談
余談ですが、PHPは変数に値を代入する際、じつは型の情報も保管しています。なので、上記のように厳密評価も必要に応じて行えるわけです。
== 列挙型 ==
395 ⟶ 285行目:
enum とは何かの説明が難しいのでコードと実行例を先に示します。
:<syntaxhighlight lang=
<?php
410 ⟶ 300行目:
$b = gameMode::menu ; // このサンプルコードでは$bは以降は未使用。参考のため書いている。
if ($a == gameMode::map ){
if ($a == gameMode::menu ){
?>
</syntaxhighlight>
;実行結果
<pre>
今マップ画面を操作中です。
433 ⟶ 323行目:
なお、おおむね用語として、
:<syntaxhighlight lang=
enum 列挙体名
{
455 ⟶ 345行目:
:<syntaxhighlight lang=
<?php
470 ⟶ 360行目:
$b = gameMode::menu ; // このサンプルコードでは$bは以降は未使用。参考のため書いている。
if ($a == gameMode::battle ){
if ($a == gameMode::menu ){
?>
</syntaxhighlight>
;実行結果
<pre>
今、戦闘画面を操作中です。
500 ⟶ 390行目:
このように、あらかじめ value および name というプロパティがenumでは決まっています。
:<syntaxhighlight lang=
<?php
// 装備画面
515 ⟶ 405行目:
if ($a == 2 ){
}
if ($a == 3 ){
}
?>
</syntaxhighlight>
;実行結果
<pre>
2番データベースを編集。
537 ⟶ 427行目:
さて、enumで定義した整数値を使って計算したい場合、下記のように<code>->value</code>プロパティで代入値にアクセスする必要があります。
:<syntaxhighlight lang=
<?php
// 装備画面
552 ⟶ 442行目:
// 現状では if 文で事前にenum格納した変数を呼び出さないとエラーになる。
if ($a == 3 ){
}
if ($a == 4 ){
}
?>
</syntaxhighlight>
;実行結果
<pre>
3番データベースを編集。
570 ⟶ 458行目:
説明の都合上、上記ではif文を書いてからブロック中でprintを使いましたが、別に事前に if文が無くてもprinttでenum変数のvalue値は表示できます。
:<syntaxhighlight lang=
<?php
// 装備画面
580 ⟶ 468行目:
}
$a = soubiMode::tate->value ;
$b = soubiMode::buki ;
?>
</syntaxhighlight>
;実行結果
<pre>
valueごと定義
605 ⟶ 493行目:
match 式の変数と条件式には、下記のように enum変数を入れることも出来ます。このため、下記のように書けます。
:<syntaxhighlight lang=
<?php
// 装備画面
619 ⟶ 507行目:
match ($a) {
soubiMode::buki, soubiMode::tate =>
soubiMode::kabuto =>
default =>
};
628 ⟶ 516行目:
</syntaxhighlight>
;実行結果
<pre>
bukiデータベースを編集。
636 ⟶ 524行目:
その他、matchの各条件(「soubiMode::kabuto」の部分)をもっと短く書きたい場合、下記コードのように、enum要素名をつかって条件分岐する方法もあります。ただし、文字列は内部的なデータ数が長くなるので、処理速度に多少の欠点が考えられる。よって可能なら、なるべく上述のようなenum変数を直接に条件にするコードのほうが良いだろう。
:<syntaxhighlight lang=
<?php
// 装備画面
649 ⟶ 537行目:
match ($a->name) {
"buki", "tate" =>
"kabuto" =>
default =>
};
658 ⟶ 546行目:
</syntaxhighlight>
;実行結果
<pre>
tateデータベースを編集。
666 ⟶ 554行目:
enum は関数の引数にすることもできる。(関数について詳しくは[[PHP/入門/関数とは]]で扱う。)
:<syntaxhighlight lang=
<?php
// 装備画面
678 ⟶ 566行目:
// $a = soubiMode::tate->value ;
function f($mode){
print "$mode->name \n";
689 ⟶ 577行目:
?>
</syntaxhighlight>
;実行結果
<pre>
enum関数実験
703 ⟶ 591行目:
なお、引用符中の <code>$mode->value</code> は、下記のように <code>{$mode->value}</code> と書いてもいい(2022年6月のPHP8.1の時点)。
:<syntaxhighlight lang=
<?php
// 装備画面
715 ⟶ 603行目:
// $a = soubiMode::tate->value ;
function f($mode){
print "{$mode->name} \n";
741 ⟶ 629行目:
PHP8では関数の引数に型をつけることができるが、下記のように引数としてenum変数を使う際には型の代わりにenumグループ名をつけることもできる。
:<syntaxhighlight lang=
<?php
// 装備画面
761 ⟶ 649行目:
</syntaxhighlight>
;実行結果
<pre>
tate
|