$ohayou = !$ohayou
こんばんは!
そんな訳はない。
でもboolean型の!trueはfalseになるんだ!
これを見た時、
凄い新鮮だった。
trueとfalseは評価でしか利用してこなかった。
だからtrueはDBに保存されたデータであり、
データのtrueが否定された時に、反転してfalseになる??!
とおおぉと驚いたのだ。
自分の中で、trueをfalseに変換する時は下記をイメージしていた。
if($A = true){
$A = false
}else{
$A = true
}
まさか
$A = !$A
これだけで良いなんて思いもしなかった。
trueの反対がfalseと認識されるのが新鮮だった。
ということで調べてみた。
古典論理の基本的な挙動
プログラミング言語はtrueかfalseのどちらかだけをとるという論理体系を基本ルールとしている。
Cなどの言語では整数値をそのままブールとして解釈する歴史的理由があり
0をfalse
それ以外の値をtrue
というルールで評価する。
PHPのブール値以外の値が否定された時のルール
PHPではboolean型以外の型でも!演算子で評価する時に、自動的にtrueかfalseに変換される。
ifで評価した時もtrueかfalseに変換されている。
これを型の自動変換、型の強制(type juggling)という。
falseとなる値は以下
- false
- 整数0
- 文字列"0"
- 空文字""
- 空の配列array()
- NULL
上記の内容以外はtrueとなる。
==と===の違い
== は等価演算子
型変換しながら比較する。
=== は厳密比較演算子
型も含めて比較する。
これを用いると
true == 1
これは同等とみなす。
true === 1
これは型が違うのでfalse
となるようだ。
DBにおける真偽値の保存はデータ
DB上でboolean型で格納した場合は下記で保持される。
trueは内部的には1かt
falseは0かf
この段階ではプログラム上の真偽評価とは別物。
この値をPHPなどで取り出す時に変数にtrueというブール値がセットされるらしい。
結局!trueがなぜfalseなのか
遠回りしたが
なぜ!trueでfalseになるのか。
これは論理否定演算子が
そう変えるものだ
と定義されているから。
という結果だった。