忍者ブログ

カウンター

プロモーション

カレンダー

10 2024/11 12
S M T W T F S
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30

AntinomyMy の実験室

   私のWEBアプリ実験室です!

ブログ内検索

楽天でお買い物

twitter

最新トラックバック

最新コメント

忍者アナライズ

ウェザーニュース

バーコード

本を買う

アクセス解析

Google+

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。


  • 2024/11/23 20:04

PHP isset() とempty() の、もやもやメモ

PHP の調べ物

今更ではあるが、毎回ふと疑問に思うことがある。
何がしたいか判っているはずなのに、度々つまずく、毎回考える、
果たしてこのisset() とempty() は何をしたい時に使うのか?
何を表しているのか?

やりたい事から知りたい事を割り出してみた。

変数の入れ物があり、型や内容が明確か?
これが知りたいのだろう、ケースはいくつかある。


したいこと 知りたい型 知りたい値
- 不明 不明
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を返すので、
多数の変数全体の判断に使うのだと思います。

以上、長ぁーーーいメモでした<_ _>     (かなり前回の編集が適当だった為、書き直してあります。) 

拍手[0回]

PR


  • 2011/05/20 15:22

コメント一覧

  • お名前
  • Email

  • コメント

  • Vodafone絵文字 i-mode絵文字 Ezweb絵文字
  • パスワード
[PR]