打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
isset-PHP手册

isset

(PHP 3, PHP 4, PHP 5)

isset -- 检测变量是否设置

描述

bool isset ( mixed var [, mixed var [, ...]] )

如果 var 存在则返回 TRUE,否则返回 FALSE

如果已经使用 unset() 释放了一个变量之后,它将不再是 isset()。若使用 isset() 测试一个被设置成 NULL 的变量,将返回 FALSE。同时要注意的是一个 NULL 字节("\0")并不等同于 PHP 的 NULL 常数。

警告: isset() 只能用于变量,因为传递任何其它参数都将造成解析错误。若想检测常量是否已设置,可使用 defined() 函数。

 

<?php

$var
= '';

// 结果为 TRUE,所以后边的文本将被打印出来。
if (isset($var)) {
    print
"This var is set set so I will print.";
}

// 在后边的例子中,我们将使用 var_dump 输出 isset() 的返回值。

$a = "test";
$b = "anothertest";

var_dump( isset($a) );      // TRUE
var_dump( isset ($a, $b) ); // TRUE

unset ($a);

var_dump( isset ($a) );     // FALSE
var_dump( isset ($a, $b) ); // FALSE

$foo = NULL;
var_dump( isset ($foo) );   // FALSE

?>

 

 

这对于数组中的元素也同样有效:

 

<?php

$a
= array ('test' => 1, 'hello' => NULL);

var_dump( isset ($a['test']) );            // TRUE
var_dump( isset ($a['foo']) );             // FALSE
var_dump( isset ($a['hello']) );           // FALSE

// 键 'hello' 的值等于 NULL,所以被认为是未置值的。
// 如果想检测 NULL 键值,可以试试下边的方法。
var_dump( array_key_exists('hello', $a) ); // TRUE

?>

 

 

注: 由于这是一个语言结构而非函数,因此它无法被变量函数调用。

参见 empty()unset()defined()array_key_exists() 和错误控制 @ 运算符。


add a note
User Contributed Notes
soywiz at php dot net
14-Apr-2006 09:12
Sometimes you have to check if an array has some keys. To achieve it you can use "isset" like this: isset($array['key1'], $array['key2'], $array['key3'], $array['key4'])
You have to write $array all times and it is reiterative if you use same array each time.

With this simple function you can check if an array has some keys:

<?php
function isset_array() {
   if (
func_num_args() < 2) return true;
  
$args = func_get_args();
  
$array = array_shift($args);
   if (!
is_array($array)) return false;
   foreach (
$args as $n) if (!isset($array[$n])) return false;
   return
true;
}
?>

Use: isset_array($array, 'key1', 'key2', 'key3', 'key4')
First parameter has the array; following parameters has the keys you want to check.
kariedoo
10-Mar-2006 02:27
Before:

//ask, if is set
$number = isset($_GET['number']) ? $_GET['number'] : '';
$age = isset($_GET['age']) ? $_GET['age'] : '';
$street = isset($_GET['street']) ? $_GET['street'] : '';

After: --> it's easier to read

//ask, if is set
 $parameter = array('number', 'age', 'street');
 foreach($parameter as $name)
 {
   $$name = isset($_GET[$name]) ? $_GET[$name] : '';
 }
red at iklanumum dot com
10-Feb-2006 02:02
This could be viewed as a philosophy. I wonder why a NULL variabel is being considered FALSE rather than TRUE while in isset, because if the variable has been unset it becomes undefined but a NULL variabel is still defined although it has no value. Or, perhaps, it's based on the memory usage, if it is how about $x="" ? Is empty value use memory too? This leads me to another thinking that the isset isn't have family relationship with unset although both of it are a language construct and have 'set' word :)
Slawek Petrykowski
29-Nov-2005 07:06
<?php
$foo
= 'a little string';
echo isset(
$foo)?'yes ':'no ', isset($foo['aaaa'])?'yes ':'no ';
>

results with unexpected values:
yes yes

Well
, it is necessary to check type of $foo first !
Peter Beckman <beckman at purplecow dot com>
21-Sep-2005 03:16
Based on the previous post, I've found this code even more useful:

<?php
function isset_sum(&$var, $val) {
   if (isset(
$var))  $var += $val;
   else             
$var  = $val;
}
?>

Now instead of:

<?php
if (isset($foo[$bar][$baz][$fooz])) $foo[$bar][$baz][$fooz] += $count;
else                               
$foo[$bar][$baz][$fooz] = $count;
?>

No more "Undefined variable" warnings, and you save your fingers and sanity!  Thanks to the previous poster for inspiration.
14-Sep-2005 06:41
I don't know if you guys can use this but i find this piece of code pretty useful (for readabillity at least):

function isset_else( $&v, $r )
{
   if( isset( $v ))
       return $v;
   else
       return $r;
}

This way you can go:

$a = 4;

$c += isset_else( $a, 0 );
$c += isset_else( $b, 0 );

echo $c;

Of course, this code would work anyway, but you get the point.
php [at] barryhunter [.] co [.] uk
08-Sep-2005 03:47
In case it helps someone, here's a table to compare different Variable tests/comparisons

http://www.deformedweb.co.uk/php_variable_tests.php
onno at itmaze dot com dot au ##php==owh
12-Aug-2005 03:33
In PHP4, the following works as expected:

if (isset($obj->thing['key'])) {
  unset($obj->thing['key']) ;
}

In PHP5 however you will get a fatal error for the unset().

The work around is:

if (is_array($obj->thing) && isset($obj->thing['key'])) {
  unset($obj->thing['key']) ;
}
richard william lee AT gmail
11-Jun-2005 02:38
Just a note on the previous users comments. isset() should only be used for testing if the variable exists and not if the variable containes an empty "" string. empty() is designed for that.

Also, as noted previosuly !empty() is the best method for testing for set non-empty variables.
darkstar_ae at hotmail dot com
25-May-2005 04:03
isset doesn't reliably evaluate variables with blank strings (not necessarily NULL).
i.e.
$blankvar = ""; // isset will return true on this.

This is a very common pitfall when handling HTML forms that return blank text fields to the script. You're better off doing this:

if ($var != "")
return true;
else
return false;

This more of a programming practice rather than the function's shortcomings. So if you have a habit of initializing variables you're likely to run into problems with isset() if your code or php project become very large.
Andrew Penry
11-May-2005 11:17
The following is an example of how to test if a variable is set, whether or not it is NULL. It makes use of the fact that an unset variable will throw an E_NOTICE error, but one initialized as NULL will not.

<?php

function var_exists($var){
   if (empty(
$GLOBALS['var_exists_err'])) {
       return
true;
   } else {
       unset(
$GLOBALS['var_exists_err']);
       return
false;
   }
}

function
var_existsHandler($errno, $errstr, $errfile, $errline) {
  
$GLOBALS['var_exists_err'] = true;
}

$l = NULL;
set_error_handler("var_existsHandler", E_NOTICE);
echo (
var_exists($l)) ? "True " : "False ";
echo (
var_exists($k)) ? "True " : "False ";
restore_error_handler();

?>

Outputs:
True False

The problem is, the set_error_handler and restore_error_handler calls can not be inside the function, which means you need 2 extra lines of code every time you are testing. And if you have any E_NOTICE errors caused by other code between the set_error_handler and restore_error_handler they will not be dealt with properly. One solution:

<?php

function var_exists($var){
   if (empty(
$GLOBALS['var_exists_err'])) {
       return
true;
   } else {
       unset(
$GLOBALS['var_exists_err']);
       return
false;
   }
}

function
var_existsHandler($errno, $errstr, $errfile, $errline) {
  
$filearr = file($errfile);
   if (
strpos($filearr[$errline-1], 'var_exists') !== false) {
      
$GLOBALS['var_exists_err'] = true;
       return
true;
   } else {
       return
false;
   }
}

$l = NULL;
set_error_handler("var_existsHandler", E_NOTICE);
echo (
var_exists($l)) ? "True " : "False ";
echo (
var_exists($k)) ? "True " : "False ";
is_null($j);
restore_error_handler();

?>

Outputs:
True False
Notice: Undefined variable: j in filename.php on line 26

This will make the handler only handle var_exists, but it adds a lot of overhead. Everytime an E_NOTICE error happens, the file it originated from will be loaded into an array.
phpnet dot 5 dot reinhold2000 at t spamgourmet dot com
10-Apr-2005 11:33
if you want to check whether the user has sent post vars from a form, it is a pain to write something like the following, since isset() does not check for zero-length strings:

if(isset($form_name) && $form_name != '') [...]

a shorter way would be this one:

if($form_name && $form_message) [...]

but this is dirty since you cannot make sure these variables exist and php will echo a warning if you refer to a non-existing variable like this. plus, a string containing "0" will evaluate to FALSE if casted to a boolean.

this function will check one or more form values if they are set and do not contain an empty string. it returns false on the first empty or non-existing post var.

<?
function postvars() {
   foreach(
func_get_args() as $var) {
       if(!isset(
$_POST[$var]) || $_POST[$var] === '') return false;
   }
   return
true;
}
?>

example: if(postvars('form_name','form_message')) [...]
yaogzhan at gmail dot com
20-Mar-2005 08:52
in PHP5, if you have

<?PHP
class Foo
{
  
protected $data = array('bar' => null);

   function
__get($p)
   {
       if( isset(
$this->data[$p]) ) return $this->data[$p];
   }
}
?>

and
<?PHP
$foo
= new Foo;
echo isset(
$foo->bar);
?>
will always echo 'false'. because the isset() accepts VARIABLES as it parameters, but in this case, $foo->bar is NOT a VARIABLE. it is a VALUE returned from the __get() method of the class Foo. thus the isset($foo->bar) expreesion will always equal 'false'.
dubmeier aaattt Y! daht calm
02-Mar-2005 07:13
Here are some handy wrappers to isset that I use when I need to do common evaluations like: this variable is set and has a length greater than 0, or: I want the variables value, or a blank, if not set.

/**
 * isset_echo()
 *
 * Accomplishes the following w/o warnings:
 *    echo $x;
 *    echo $x[$y];
 *    echo $x[$y][$z];
 *
 * FIXME: make this recursive so it works for N args?
 */
function isset_echo($x, $y=Null, $z=Null)
{
   if (is_array($x)) {
       if (array_key_exists($y, $x)) {
           if (is_array($x[$y])) {
               if (array_key_exists($z, $x[$y])) { echo $x[$y][$z]; }
           }
           else { echo $x[$y]; }
       }
   }
   else { echo $x; }
}

/**
 * isset_value()
 *
 * As above, but returns value instead of echoing
 */
function isset_value(&$x, $y=Null)
{
   if (is_array($x)) {
       if (array_key_exists($y, $x)) { return $x[$y]; }
   }
   else { return $x; }
}

/**
 * isset_and_equals()
 *
 * As above, but ...
 * Returns true if variable (or array member) is set and equaL to the first parameter
 */
function isset_equals($val, $w, $x=null, $y=null, $z=null) {
   if (is_array($w)) {
               if (array_key_exists($x, $w)) {
               if (is_array($w[$x])) {
                       if (array_key_exists($y, $w[$x])) {
                                   if (is_array($w[$x][$y])) {
                                       if(array_key_exists($z, $w[$x][$y])) {
                                               return ($w[$x][$y][$z] == $val) ? true : false;
                                       }
                                   } else {
                                       return ($w[$x][$y] == $val) ? true : false;
                                   }
                           }
                   } else {
                       return ($w[$x] == $val) ? true : false;
                   }
       }
   } else {
               return ($w == $val) ? true : false;
       }
}

/**
 * isset_gt0()
 *
 * As above, but returns true only if var is set and it's length is > 0
 */
function isset_gt0(&$x)
{
   if (isset($x) && strlen($x) > 0) { return true; }
   else { return false; }
}
codeslinger at compsalot dot com
07-Feb-2005 02:21
according to the docs -- "isset() will return FALSE if testing a variable that has been set to NULL."

That statment is not always correct, sometimes isset() returns TRUE for a NULL value.  But the scenarios are obtuse.  There are a tons of bugs on this subject, all marked as bogus.

Problems occur when NULLs are in named fields of arrays and also when vars are passed by reference.

do lots of testing and code defensively.

is_null()  is your friend...
pianistsk8er at gmail dot com
10-Dec-2004 10:23
This function is very useful while calling to the URL to specify which template to be used on certain parts of your application.

Here is an example...

<?php

   $cat
= $_GET['c'];
  
$id = $_GET['id'];   
  
$error = 'templates/error.tpl';

   if( isset(
$cat))
   {
       if( isset(
$id))
       {
          
$var = 'templates/pics/' . $cat . '-' . $id . '.tpl';
           if (
is_file($var))
           {
               include(
$var);
           }
           else
           {
               include(
$error);
           }
       }
       else
       {
          
$var = 'templates/pics/' . $cat . '.tpl';       
           if (
is_file($var))
           {
               include(
$var);
           }
           else
           {
               include(
$error);
           }
       }
   }
   else
   {
       include(
'templates/alternative.'.tpl);
   }

?>

You can see several uses of the isset function being used to specify wheter a template is to be called upon or not.  This can easily prevent other generic PHP errors.
jc dot michel at symetrie dot com
15-Nov-2004 06:35
Using
  isset($array['key'])
is useful, but be careful!
using
  isset($array['key']['subkey'])
doesn't work as one could expect, if $array['key'] is a string it seems that 'subkey' is converted to (integer) 0 and $array['key']['subkey'] is evaluated as the first char of the string.
The solution is to use
  is_array($array['key']) && isset($array['key']['subkey'])

Here is a small code to show this:

<?php
$ex
= array('one' => 'val1','two' => 'val2');
echo
'$ex = ';print_r($ex);
echo
"<br />";

echo
" isset(\$ex['one']['three']) : ";
if (isset(
$ex['one']['three']))
   echo
'true';
else
   echo
'false';

echo
"<br />";
echo
"is_array(\$ex['one']) &&  isset(\$ex['one']['three']) : ";
if (
is_array($ex['one']) && isset($ex['one']['three']))
   echo
'true';
else
   echo
'false';
?>

shows:
$ex = Array ( [one] => val1 [two] => val2 )
isset($ex['one']['three']) : true
is_array($ex['one']) && isset($ex['one']['three']) : false
jon
08-Dec-2003 02:19
Since PHP will check cases in order, I often end up using this bit of code:

<?php
if (isset($var) && $var) {
  
// do something
}
?>

In short, if you have error reporting on, and $var is not set, PHP will generate an error if you just have:

<?php
if ($var) { // do something }
?>

...but, as noted elsewhere, will return True if set to False in this case:
<?php
if (isset($var)) { // do something }
?>

Checking both to see if $var is set, and that it equals something other than Null or False is something I find very useful a lot of times.  If $var is not set, PHP will never execute the second part of "(isset($var) && $var)", and thus never generate an error either.

This also works very nice for setting variable as well, e.g.:
<?php
$var
= (isset($var) && $var) ? $var : 'new value';
?>
flobee at gmx dot net
09-Sep-2003 05:16
just as note: if you want to check variables by boolean value: true or false , "isset" has a different meaning!
<?php
$var
=null;
// sample 1
if($var) {
  
// if true or another value exept "false" , "null": go on here
  
echo "1. var is true or has a value $var<br>";
} else {
   echo
"1. var is "false" or "null"<br>";
}

if(!
$var) {
  
// if false or "null": go on here
  
echo "2. var has no value $var<br>";
} else {
   echo
"2. var is "false" or "null"<br>";
}

// sample 2
$var =false;
if(isset(
$var)) {
 
// $var is false so it is set to a value and the execution goes here
  
echo "3. var has value: $var<br>";
}

$var=null;
if(!isset(
$var)) {
 
// $var is null (does not exist at this time) and the execution goes here
  
echo "4. var was not set $var<br>";
}
?>
05-May-2000 08:11
To find out what member vars are defined in a class, use the get_class_vars() function (see http://www.php.net/manual/function.get-class-vars.php)

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
PHP中判断变量为空的几种方法
在PHP语言中使用JSON
php中empty()、isset()、is_null()和变量本身的布尔判断区别
php入门(20)
编程语言利用PHP判断是手机移动端还是PC端访问的函数示例_php技巧
php中empty(), is
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服