読者です 読者をやめる 読者になる 読者になる

ほげほげ(仮)

仮死状態

emptyとissetの違い

PHP

emptyとissetは結構迷うところなので、備忘録としてまとめておきます。


PHP Manualによると次のように説明されます。

empty ― 変数が空であるかどうかを検査する

http://jp2.php.net/manual/ja/function.empty.php

isset ― 変数がセットされていること、そして NULL でないことを検査する

http://jp2.php.net/manual/ja/function.isset.php

empty

emptyは空でないか、0でない値であれば FALSE を返します。

PHP Manualによると空と判定されるのは次のものです。

・"" (空文字列)
・0 (0 は整数)
・"0" (0は文字列)
・NULL
・FALSE
・array() (空の配列)
・var $var;(変数が宣言されているが、クラスの中で値が設定されていない)


確かめてみます。

<?php
// $varを宣言しただけ
$var;
var_dump(empty($var));	// true

// $varが空文字
$var = '';
var_dump(empty($var));	// true

// $varが0
$var = 0;
var_dump(empty($var));	// true

// $varが'0'
$var = '0';
var_dump(empty($var));	// true

// $varがnull
$var = null;
var_dump(empty($var));	// true

// $varが空の配列
$var = array();
var_dump(empty($var));	// true

// 存在しない配列要素
$var = array('a'=>1);
var_dump(empty($var['b']));	// true

// 配列要素が0
$var = array('a'=>0);
var_dump(empty($var['a']));	// true

// クラス内で宣言されているだけ
class Test {
	var $var;
}
$test = new Test();
var_dump(empty($test->var));	// true
?>

次にfalseになるパターンを試します。

<?php
// $varが'a'
$var = 'a';
var_dump(empty($var));	// false

// $varが半角スペース
$var = ' ';
var_dump(empty($var));	// false

// $varが1
$var = 1;
var_dump(empty($var));	// false

// $varが-1
$var = -1;
var_dump(empty($var));	// false

// $varが配列
$var = array(1);
var_dump(empty($var));	// false

// 存在する配列要素
$var = array('a'=>1);
var_dump(empty($var['a']));	// false

class Test {
	var $var = 'a';
}
// インスタンス
$test = new Test();
var_dump(empty($test));	// false

// インスタンス変数
var_dump(empty($test->var));	// false
?>


ちょっとややこしいのが「0」もtrueと判断するところかと思います。自分もそれでハマったこともあります。
配列の要素の存在確認で使ってしまうと中身が「0」だったときに思った結果にならないかもしれません。

isset

issetは変数が設定されていてnullではない場合にtrueを返します。

<?php
// $varが空文字
$var = '';
var_dump(isset($var));	// true

// $varが0
$var = 0;
var_dump(isset($var));	// true

// 存在しない変数
var_dump(isset($test));	// false

// $varがnull
$var = null;
var_dump(isset($var));	// false

// $varが空の配列
$var = array();
var_dump(isset($var));	// true

// 存在しない要素
$var = array('a'=>0);
var_dump(isset($var['b']));	// false

class Test {
	var $var;
}
// インスタンス
$test = new Test();
var_dump(isset($test));	// true

// クラス内で宣言されているだけ
var_dump(isset($test->var));	// false
?>

issetのほうが分かりやすい感じだと思います。

まとめ

慣れてくればたいしたことは無さそうだけど、オレもPHP経験は浅いので注意しながらやっていきたいところですね。