PHP Manual
/
基礎知識

PHP の条件 - IF() {...} - 分岐オプション

26. 11. 2019

Obsah článku

> **注意:** この記事は、PHPの基本的な理解を前提としているため、一部の初心者には少し面倒かもしれません。コンディションの仕組みに興味がある方は、初級編でコンディションについてを読んでみてください。

対応バージョン:PHP 4、PHP 5、PHP 7の全バージョン
概要:|1つまたは複数のステートメントの検証
タイプ: ステートメント、コンストラクト (関数ではありません)

商品説明

等式が成り立つかどうか、あるいは文が真であるかどうかを判断する必要があることがよくありますが、そのための条件です。PHPは、他の多くの言語(特にC言語)と同様に以下の構文を使用します。

if (/* 論理文 */) {
// コンストラクト
}

各論理式は TRUE (真) または FALSE (偽) の値を持ち、それ以外の選択肢はない。

変数 $x が変数 $y よりも大きいかどうかを比較する例です。

$x = 10;
$y = 5;
if ($x > $y) {
// このスクリプトの部分は、条件が真である場合に実行されます。
} else {
// スクリプトのこの部分は、条件が適用されない場合に実行されます。
}

条件式は丸括弧で囲まれた必須の内容であり、その中に演算子で構成されるテストされる式が与えられる(概要は後述)、複数の式は論理演算子で連結できる(概要は後述)。

さらに、この条件には2つのオプションのステートメントブロックが含まれています。

  • 条件が成立する場合
  • 条件が成立しない場合

実用的な理由から、条件が真である場合は、少なくとも最初のステートメントのブロックを常に含めるようにします。そうしないと、式のテストが意味を成さないからです。

セミコロンと括弧の使用について

一般的には

  • 括弧は論理式の区切りに使用します(他の丸括弧はより複雑な式を実現するために突っ込むことができます)。
  • 複合**括弧は、コマンドや関数のブロックを区切るために使用されます。
  • 中**は条件を示すためではなく(コマンドのブロックは複合ブラケットで区切られる)、条件内の個々のコマンドを区切るために使用されます。)

セミコロンを使った表記が唯一可能です(endif構文を使用する場合を除く)。

if ($x > $y);

しかし、いずれの場合も比較結果は破棄され、条件に属する文は実行されないので、このような条件は無意味である。

代替表記法

特定の条件下では、複合括弧を省略して if 構造を使用することができます。以下の場合のみ実現可能です。

  • 条件の中で1つだけ文を実行すると。
  • 複合括弧の代わりにコロンとendifを用いると
  • インライン」表記にすると

より詳細な情報は、次の3章をご覧ください。

1.コマンドは1つだけ~省略構文~**。

1つの構成要素(ステートメント)のみを実行する条件を作成する場合、古典的な複合ブラケット記法のいずれかを使用することができます。

if ($x > 10) { $y = $x; }

あるいは、括弧を省略することもできる。

if ($x > 10) $y = $x;

ただし、この動作は条件のすぐ近くにある1つのコマンドにのみ適用されます。

より良い例です($y = $x の構成だけが条件付きで実行され、残りは常に実行されます)。

$x = 5;
$y = 3;
$z = 10;
if ($x > $y)
$y = $x;
$x = 3;

2.コロンとendif;

if (/* 式 */):
konstrukt;
konstrukt;
konstrukt;
endif;

しかし、この表記法は、複数の条件を自らに没頭させると方向性が低下するため、長らく時代遅れとされてきた。

**注:**このスタイルは、Yuhさん(彼の記事を参照)のような一部の人々にも好まれていることを記しておきたいと思います。これをどこかで使うのは神頼み。

3.三項式〜一行「インライン」表記.

時には、他の操作と一緒に(例えば、新しい変数の定義と一緒に)単純なインライン比較を行うのが便利な場合があります。もし、1つの文だけを実行したいのであれば、できるだけシンプルにしながらも、全体の手順を1行に減らすことができます。

$x = 5;
$isBiggerThanTwo = ($x > 2 ? true : false);
// あるいはもっと短い。
$isBiggerThanTwo = ($x > 2);
// または括弧なし。
$isBiggerThanTwo = $x > 2;

演算子テーブル

条件内では2種類の演算子が使用される。

  • Comparative ~ 特定の関係を比較するのです。
  • 論理的** ~ 複数の式を組み合わせて複雑な条件を作成する。

比較演算子

演算子|意味
==`| イコール
===
!= と等しくない
>=
<=
>| グレーター

例($xが5でないときに有効)。

if ($x != 5) { ... }

論理演算子

演算子|代替|意味|以下の場合に真となる。
AND|そして同時に|両方の値が真になる
`
^|XOR| 排他的論理和|少なくとも一方は真か偽であるが、両方はありえない。
!doesn't| 式の否定| false のときは true 、逆のときは true となります。
()`| しない|表現否定|状況によって変わる

もっと複雑な例。

$x = 5;
$y = 3;
$z = 8;
if ($x > 0 && !($y != 2 && $z == $x) || $z > $y) { ... }

論理演算子、比較演算子の省略

どちらかの演算子(あるいは両方)を省略できる場合もありますが、結果として得られる式を正しく動作させるためには、正しい使い方のルールを決して忘れてはなりません。

一般に、演算子を含まない式をテストするときは、その値が TRUE であるか、空でないか(たとえば、0でない数、空でない文字列、...)をテストします。

$x = 5;
$y = 3;
$z = 8;
if ($x) { ... } // x は空ではないので、通過します。
if ($x && $y) { ... } // x と y は空ではないので通過します。
if (!$x) { ... } // TRUE が否定されるため失敗
if (isset($z)) { ... } // 変数 $z が存在するので合格

しかし、特に厄介な状況が発生することがあります。

  • if ($x)を求めると、変数$x にゼロ(0`)が含まれていると、その条件は満たされない。
  • あるいは、変数 $x に文字列 0 (数字のゼロ) が含まれていると、ゼロにオーバーフローしてしまうので、式は真にならないからです。
  • 条件の中に、常に何らかの空でない文字列を返す関数がある。そうすれば、条件は常に真になるからだ。
  • また、ユーザーからの入力をチェックして、ユーザーが文字列として 'false' を返した場合、文字列は空ではないので、ここでも条件は真となる。

これには、シンプルで効果的な解決策を一つお勧めします。それは、返される文字数を尋ねることです。文字列が空の場合(または変数が存在しない場合)には、0文字が返され、条件は満たされない。簡単な例です。

$x = '0';
if ($x) { ... } // この条件は通常適用されません
if (strlen($x)) { ... } // x は1文字を含むので、条件は有効である。

次に、isset()関数を使って、変数が存在するかどうかをテストします。

文字列の比較

弦が同じであることを見つけるのは簡単です。

$a = '猫';
$b = '猫';
if ($a === $b) {
// 文字列が同じ場合
} else {
// 文字列が異なる場合
}

万が一、その項目が他の項目と等価である可能性があるため、データ型にきちんと目を配ることが重要です。

例えば、空の文字列 $a = ''; は、文字列 NULL: $b = NULL; と異なる。例えば、データベースでは、値が存在しないか、空であるかの違いがあるため、この区別をする必要があります。

$a = '';
$b = null;
if ($a == $b) {
// TRUEと評価されるのは
// データ型が変換される。
}
if ($a === $b) {
// より厳密な検証を行う。
// というのは、異なる
// コンテンツとデータ型が異なるため
// このコードは決して実行されません。
}

また、文字列を比較する際には、スペース、タブ、改行などの白字(不可視文字)を無視するのがよいでしょう。これは、例えば、パスワードを入力してハッシュ関数に渡すときに便利である。

$password = '81dc9bdb52d04dc20036dbd8313ed055'; // 1234
$userPassword = '1234';
if (md5(trim($userPassword)) === $password) {
// trim()関数は自動的に空白を削除する。
}

不明(非存在)値?

値が存在しない (TRUEでもFALSEでもない) 場合、主にデータベースから取得した値 (例えば、存在しないカラムを問い合わせた場合) が返されることがありますが、この場合はNULL` データ型を返します。

一般に、NULLFALSE として評価される。つまり、条件は適用されない。しかし、値が存在しないことが必ずしもレコードがないことを意味しないため、この動作は必ずしも便利とは言えません。

実践からの例ユーザープロファイルがあり、そのユーザーのウェブページに問い合わせをする。すべてのユーザーがウェブページを持つ必要はないので、この場合は NULL が返されますが、ユーザーはまだ存在します。ですから、この場合はむしろ isset() 関数を使って変数が(存在しない)かどうかをテストし、特定の値に基づいて結論を出さないようにすべきです。

Jan Barášek   Více o autorovi

Autor článku pracuje jako seniorní vývojář a software architekt v Praze. Navrhuje a spravuje velké webové aplikace, které znáte a používáte. Od roku 2009 nabral bohaté zkušenosti, které tímto webem předává dál.

Rád vám pomůžu:

Související články

1.
8.
Status:
All systems normal.
2024