タイトルの通り、if文の条件式の中に「!」が入るとわけわからなくなるので、自分用に整理。
自分もPHP初心者なので、なるべく伝わるよう意識して書きます。
この記事を読んで学べること
if(条件式)の中身がTRUE(真)かFALSE(偽)によって、処理がどう進むかを理解する。
対象者:PHP初心者 if文やfor文、配列など基本的な構文がわかってると入りやすいと思います。
基本のif文
まずは、基本のif文から。
if(条件式) {
条件式がTRUE(真)だったときの処理
}else{
条件式がFALSE(偽)だったときの処理
}
前提として、if文は()の中に条件式を書く。そして、その条件式が当てはまる場合はTRUE(真)。当てはまらない場合はFALSE(偽)を返してくる。
返すって?
「〜を返す」とは返り値や戻り値と呼ばれるもの。プログラムから返ってくる値が「〜」の部分に当たる。
キャッチボールで例えると投げた球がちゃんと返ってくることに近いと思う。
球を投げて処理を行う→その結果をボールを返してもらって受け取るみたいな。
そして、値が返された結果として最終的に条件式そのものがTRUE(真)かFALSE(偽)を持つことになる。
$num = 1;
var_dump($num === 1);
//bool(true)
var_dumpを使って$numが1であるか確認。もちろん中身は1なので、TRUEが返ってくる。
これを元にif文を見ていこう。
$num = 1;
if($num === 1){
echo 'こんにちは';
}else{
echo 'おやすみ';
}
//条件式がTRUEなので「こんにちは」と表示される。
条件式がTRUE(真)だったので、直後の{ }に進みその処理が走る。結果「こんにちは」と表示される。
$num = 1;
if($num === 1000){
echo 'こんにちは';
}else{
echo 'おやすみ';
}
//$numの中身を1000に変更。今度は条件式がFALSEなので「おやすみ」と表示される。
条件式がFALSE(偽)だったので、直後の{ }には進まずelseに進む。結果「おやすみ」と表示される。
ここまでが基本のif文となる。まずは、ここをしっかり抑えた上で次に進もう。
if文に「!」がついたら
本題のif文の条件式に「!」がついた場合を見ていく。
まず、「!」マークは論理演算子の1つで、意味は「否定」。
条件式の前に「!」をつけて使う。
if(!(条件式)){
条件式がTRUE(真)だったときの処理
}else{
条件式がFALSE(偽)だったときの処理
}
一見、前と使い方は変わらなそうだが条件式の部分がややこしくなっている。
「!」がつくと条件式が「〜ではなかったら」TRUE(真)だったときの処理に進むようになる。
文章だとわかりにくので、コードで見てみよう。
$num = 1;
if(!($num === 1)){
echo 'こんにちは';
}else{
echo 'おやすみ';
}
//「$numが1ではなかったら」TRUE(真)の処理に進む。$numは1なので、elseに進み「おやすみ」と表示される。
どうだろう。コードで見ると、文章で書くよりわかりやすいのではないだろうか?
$num = 1000;
if(!($num === 1)){
echo 'こんにちは';
}else{
echo 'おやすみ';
}
/*「$numが1ではなかったら」TRUE(真)の処理に進む。
$numは1000なので、条件「$numが1ではなかったら」を満たしている。
その結果条件式直後の{ }に進み「こんにちは」と表示される。*/
こちらも、理解できただろうか?
これは条件式の中身が数字なので理解しやすいと思う。
「!」マークの後の変数を( )で括る必要あるの?
例ではif(!(変数))のように「!」マークの後の変数を( )で括っていた。実際、変数を括らずにif(!変数)という形でも動く。
が、うまく動かないこともある。
それには演算子の優先順位というものが関係しているっぽい。(四則演算の時の決まりみたいなもん)
気になる方は公式をチェックしてみるとよい。
実際、上の( )を外した状態だと思うようにコードが動かず焦った。書いていると新しい発見もあるものだ。
ではもし条件式の中身が数字ではなくTRUEやFALSE(真偽値)の場合はどうなるだろうか。
実際のPHPを書いていると、if文の中に関数を入れることがよくある。関数の返り値が数字ならわかりやすいが、関数の返り値がTRUEやFALSE(真偽値)で返ってきた時に混乱して詰まってしまった。今回はこの部分をしっかりと理解するために記事を書いた。(やっと本題だ!)
関数とは
勝手に望んだ処理をしてくれる便利な装置。エクセルで「SUM」を使ったことがある人も多いと思うが、あれも関数だ。SUMの中に、セルの範囲を入れれば勝手に足し算してくれるように、望んだ処理を自分で作ることができる便利なものだ。
「function 関数名」みたいな形で使われる。
まずは、基本のif文で試してみよう。
変数にTRUE(真)や、FALSE(偽)を突っ込んでみる。
$num = TRUE;
if($num === TRUE){
echo 'こんにちは';
}else{
echo 'おやすみ';
}
//$numの値はTRUEで、条件式を満たした。よって、「こんにちは」が表示される。
$num = FALSE;
if($num === TRUE){
echo 'こんにちは';
}else{
echo 'おやすみ';
}
//$numの値はFALSEで、条件式とは噛み合わない。条件式はFALSEを持つことになる。よって、「おやすみ」が表示される。
さあ、ここまでついてこれているだろうか。
では、次に「!」をつけたverを見てみる。
$num = TRUE;
if(!($num === TRUE)){
echo 'こんにちは';
}else{
echo 'おやすみ';
}
//$numの値はTRUE。「!」によって条件式は[$numがTRUEでない場合]にTRUEとなる。
よって条件式は、FALSEになるので「おやすみ」が表示される。
書いててもめちゃくちゃややこしい。「(条件式の中身が偽)= 真」ってことなんだけど。
$num = FALSE;
if(!($num === TRUE)){
echo 'こんにちは';
}else{
echo 'おやすみ';
}
//$numの値はFALSE。「!」によって条件式は[$numがTRUEでない場合]にTRUEとなる。
//よって条件式はTRUEを持つので、「こんにちは」が表示される。
公式はなんて書いてあるのかチェックしてみよう。
公式は「TRUEでない場合TRUE」と書かれている。
つまりFALSEがTRUEってことになる。
日本語って難しい〜。
以上ここまでが、今回自分がまとめておきたかったことである。たぶんこれからも「 ! 」に遭遇すると固まってしまうと思うがその度にこのページを見返していこうと思う。
一応、応用としてelseifに「!」がついた時もまとめておこうと思うが、ここまでで精一杯なら余裕があるときに、見てみてほしい。
【応用】elseifに「 ! 」がついたら
応用として、if文にelseifが加わり、かつ「!」がついた時を見てみる。
まずは、基本のelseif文から。文章とコード両方とも見ていく。
if(条件式①){
条件式が①TRUE(真)だった場合の処理
}elseif(条件式②){
条件式①がFALSE(偽)で、条件式②がTRUE(真)だった場合の処理
}else{
条件式①、②どちらもFALSEだった場合の処理
}
$num = 1;
if($num === 10){
echo 'こんにちは';
}elseif($num === 100){
echo 'おやすみ';
}else{
echo 'おはよう';
}
//$numは1で、条件式のどれにも当てはまらないので、elseの先に進み「おはよう」と表示される。
elseif文を使えばいくつでも条件式を増やしていくことができる。あんまり使いすぎるとわけわからなくなりそうなので、自分がわかる範囲で使っていきたい。
では、elseifに「 ! 」をつけたものを見てみる。
if(条件式①){
条件式が①TRUE(真)だった場合の処理
}elseif(!(条件式②)){
条件式①がFALSE(偽)で、条件式②がTRUE(真)だった場合の処理
}else{
条件式①、②どちらもFALSEだった場合の処理
}
$num = 1;
if($num === 10){
echo 'こんにちは';
}elseif(!($num === 100)){
echo 'おやすみ';
}else{
echo 'おはよう';
}
/*
$numは1で、最初の条件式[$numが10]を満たさないのでFALSEとなり、
elseifに進む。
次の条件式[$numが100でない場合TRUE]を満たすので直後の{ }に進み「おやすみ」と表示される。
*/
このようにelseif文に「 ! 」がついてもやることはif文に「!」がついた時と変わらない。
「TRUEでない場合TRUE」を思い出して判断していこう。
まとめ
- 条件式そのものがTRUE(真)もしくはFALSE(偽)を持つ。
- 条件式がTRUE(真)の場合、直後の{ }に進み、FALSE(偽)だったらelseの先に進む。
- 「 ! 」は論理演算子で意味は「否定」を表す。条件式の前につけて、「 if(!(条件式)){ } 」の形で使う。
- 「!」がついた場合、条件式の中身がTRUEでない場合TRUEとなる。
まとめると、こんなとこだろうか?
結局文章の意味でパッと見た時にわからなくなりそうだが、何回もコードを書いていくうちに自然と理解でいていくことなのではないだろうか?
もしかしたら、自分が間違えて理解している部分もあるかもしれないので、ミスを見つけたら修正します。
参考になれば幸いです。