[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
PHP の調べ物
したいこと | 知りたい型 | 知りたい値 |
- | 不明 | 不明 |
Falseと0を別扱いしたい | 不明 | 判る |
型が作られたら値0だと判断させたくない | 判る | 不明 |
- | 判る | 判る |
結局色を変えた2種類の事柄が知りたいが為に
isset() とempty() の関数を使うのだと思う。
ぶっちゃけ、ネットで色々調べるが、
最終的に解決できるであろう場所はココにある
公式マニュアルのPHP 型の比較表だ。
そして何よりもNULL とは何なのか?
これも公式マニュアルのNULLにも
その事柄が書いてある。
確かにその通りなのであるが、
しかし、これだけでは実感できない。
特に私の場合には配列の中身の扱いが不安である。
なので少し実験してみた。
以下ソース
---------------------------------------------------------------
<?php
header('Content-type: text/html; charset=UTF-8');
echo 'いきなりx</br>isset:'. (isset($x)?'何かある':'空') . ' empty:'. (!empty($x)?'何かある':'空') . '</br></br>';
var_dump($x);
echo '配列として見る</br>issetx[0]:'. (isset($x[0])?'何かある':'空') . ' empty:'. (!empty($x[0])?'何かある':'空') . '</br></br>';
var_dump($x);
$x[10]=0;
echo 'いきなりx[10]に0を代入</br>isset[10]:'. (isset($x[10])?'何かある':'空') . ' empty:'. (!empty($x[10])?'何かある':'空') . '</br></br>';
var_dump($x);
$x=0;
echo 'xに0を代入</br>isset:'. (isset($x)?'何かある':'空') . ' empty:'. (!empty($x)?'何かある':'空') . '</br></br>';
var_dump($x);
$x=array();
echo 'xを配列宣言</br>isset:' . (isset($x)?'何かある':'空') . ' empty:'. (!empty($x)?'何かある':'空') . '</br></br>';
var_dump($x);
$x[0]=0;
echo '配列xの[0]に0を代入</br>isset:' . (isset($x)?'何かある':'空') . ' empty:'. (!empty($x)?'何かある':'空') . '</br></br>';
var_dump($x);
$x[0]=1;
echo '配列xの[0]に1を代入</br>isset:' . (isset($x)?'何かある':'空') . ' empty:'. (!empty($x)?'何かある':'空') . '</br></br>';
var_dump($x);
$x[1]=1;
echo '配列xの[1]に1もを代入</br>isset:' . (isset($x)?'何かある':'空') . ' empty:'. (!empty($x)?'何かある':'空') . '</br></br>';
var_dump($x);
unset($x[0]);
echo '配列xの[0]だけunset</br>isset:' . (isset($x)?'何かある':'空') . ' empty:'. (!empty($x)?'何かある':'空') . '</br></br>';
var_dump($x);
unset($x);
echo 'x全てをunset</br>isset:'. (isset($x)?'何かある':'空') . ' empty:'. (!empty($x)?'何かある':'空') . '</br></br>';
var_dump($x);
echo ($x?'true':'false');
?>
---------------------------------------------------------------
以下結果:
---------------------------------------------------------------
いきなりx
isset:空 empty:空
null
配列として見る
issetx[0]:空 empty:空
null
いきなりx[10]に0を代入
isset[10]:何かある empty:空
array 10 => int 0
xに0を代入
isset:何かある empty:空
int 0
xを配列宣言
isset:何かある empty:空
array empty
配列xの[0]に0を代入
isset:何かある empty:何かある
array 0 => int 0
配列xの[0]に1を代入
isset:何かある empty:何かある
array 0 => int 1
配列xの[1]に1もを代入
isset:何かある empty:何かある
array 0 => int 1 1 => int 1
配列xの[0]だけunset
isset:何かある empty:何かある
array 1 => int 1
x全てをunset
isset:空 empty:空
null
false
---------------------------------------------------------------
結果
まず関係の無いことかもしれないが、
PHP では
型宣言されていないなんらかの変数を
配列として中身を初めて見ても、
その後から配列として型宣言された扱いとなったりはしない。
当たり前と言えば当たり前なのだが、
案外インスタンス関係はややこしく仕様が介入するので、
もしや?!なんて思ってしまうことがあるので、
これは収穫だったと思えた。
次に型の有無、これは型があり、値が使われていなければ
Emptyになると配列では証明された。
配列のEmptyは全く持って0 やFalse と変わらない、
その為型宣言後なのかだけを調べることはisset 関数でもempty 関数でも出来ない。
Emptyでは0やfalse 以外かどうかしかわらない、名前は空(empty)とと言う名称なので
型判断に思えてしまうので、毎回考えてしまうが、値が0やfalse以外かどうかしか確認できない。
つまり、結局値では0が代入されたりfalse だったりすればempty 関数ではTlue を返す。
empty関数が空であるtlue を返すのは型が宣言されていない時、0やfalse、empty の時。
※分かりにくいので ! をつけた !emptyとして使ったほうが理解しやすい場合もある、私の例題ではそうしている。
そしてisset関数が空であるFalse を返すのは
型が設定されていない時以外は結果的に全て返す。
また、0であってもfalseであっても型があればTlue を返す。
(isset関数で複数を同時に検査した場合、一つでもfalse判定であると、isset関数はfalseを返すので
それには注意が必要。)
型 | 値(x) | !empty(x) | isset(x) |
有 (例ではarray) |
0,false,empty | false | true |
0,false,empty以外 | true | true | |
無(NULL) | NULL(値として比較すると0,false,emptyに相当) | false | false |
一応参考のソースと結果を載せておく。
<?php
header('Content-type: text/html; charset=UTF-8');
echo (NULL==false?'NULL==false 同じ':'NULL==false 違う') . '</br>';
echo (NULL==0?'0==false 同じ':'0==false 違う') . '</br>';
echo (NULL===false?'NULL===false 同じ':'NULL===false 違う') . '</br>';
echo (NULL===0?'0===false 同じ':'0===false 違う') . '</br>';
?>
------ 結果 -------
NULL==false 同じ
0==false 同じ
NULL===false 違う
0===false 違う
当たり前であるが、NULLと型が一致するのはNULLしかない。
結論:
型チェックと数値チェックを混同しがちなisset関数と
!をつけた方が理解しやすい!empty関数、
これらを使い数値のチェックをするのは良いが、
型が存在するかなどは、配列に使えば話が変わる様に、
配列であるかなどのチェックが必要な場合がある。
型をチェックするのであれば、
is_array関数を用いるべきであり、
他の型をチェックするのには
is_から始まる 変数操作関数を使うべきである。
isset関数はNULL型かどうかの比較機能もつけた!empty関数だと
思えば良いのかもしれないが、実際はNULL型(値)との比較をするか、
is_null を使った方が良い場合もある。
特に細かく型を判定した方が良い場合などは
isset関数を使ってしまうよりは良いかもしれない。
そもそも紛らわしいのは、empty関数が空である場合をTrueとしていることである。
なので! をつけて !emptyとして使わなければいけないので、
これとisset関数の使い勝手を比較するのはとてもややこしく思えるのでした。
また、isset関数は、多くの引数を使い、多くの引数の中で1つでもisset関数で
falseな場合には1つでもTrueがあったとしても関数はfalseを返すので、
多数の変数全体の判断に使うのだと思います。
以上、長ぁーーーいメモでした<_ _> (かなり前回の編集が適当だった為、書き直してあります。)
コメント一覧