isset

(PHP 4, PHP 5, PHP 7, PHP 8)

isset确定一个变量是否已声明且不同于 null

描述

isset(mixed $var, mixed ...$vars): bool

确定一个变量是否被认为已设置,这意味着该变量是否已声明且不同于 null

如果一个变量已使用 unset() 函数取消设置,则它不再被认为已设置。

isset() 在检查已分配给 null 的变量时将返回 false。还要注意,空字符 ("\0") 不等效于 PHP null 常量。

如果提供多个参数,则 isset() 仅当所有参数都被认为已设置时才返回 true。评估从左到右进行,并在遇到未设置的变量后停止。

参数

var

要检查的变量。

vars

其他变量。

返回值

如果 var 存在且具有除 null 之外的任何值,则返回 true。否则返回 false

示例

示例 #1 isset() 示例

<?php

$var
= '';

// 这将评估为 TRUE,因此将打印文本。
if (isset($var)) {
echo
"此变量已设置,因此我将打印.";
}

// 在接下来的示例中,我们将使用 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, 'pie' => array('a' => 'apple'));

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

// 检查更深层的数组值
var_dump(isset($a['pie']['a'])); // TRUE
var_dump(isset($a['pie']['b'])); // FALSE
var_dump(isset($a['cake']['a']['b'])); // FALSE

?>

示例 #2 isset() 在字符串偏移量上的使用

<?php
$expected_array_got_string
= 'somestring';
var_dump(isset($expected_array_got_string['some_key']));
var_dump(isset($expected_array_got_string[0]));
var_dump(isset($expected_array_got_string['0']));
var_dump(isset($expected_array_got_string[0.5]));
var_dump(isset($expected_array_got_string['0.5']));
var_dump(isset($expected_array_got_string['0 Mostel']));
?>

上面的示例将输出

bool(false)
bool(true)
bool(true)
bool(true)
bool(false)
bool(false)

注意

警告

isset() 仅适用于变量,因为传递任何其他内容会导致解析错误。要检查 常量 是否已设置,请使用 defined() 函数。

注意: 由于这是一个语言结构,而不是一个函数,因此它不能使用 可变函数命名参数 调用。

注意:

当在不可访问的对象属性上使用 isset() 时,如果已声明,将调用 __isset() 重载方法。

另请参阅

添加注释

用户贡献的注释 19 注释

p_ignorethis_lbowers at gmail dot com
7 年前
我也很沮丧地发现 isset($foo) 如果 ($foo == null) 则返回 false。以下是一个(笨拙的)解决方法。

unset($foo);
if (compact('foo') != array()) {
do_your_thing();
}

当然,这非常不直观、冗长、难以理解且笨拙。最好设计你的代码,使其不依赖于未设置变量和值为 null 的变量之间的区别。但“更好”仅仅是因为 PHP 做出了这种奇怪的开发选择。

在我看来,这是 PHP 开发中的一个错误。名称(“isset”)应该描述函数,而不是描述为“已设置且不为 null”。如果它被正确地完成,程序员可以很容易地使用 (isset($var) || is_null($var)) 来检查这一点!

设置为 null 的变量与未设置的变量处于不同的状态——应该有一些简单的方法来区分它们。仅仅是我的 (无用的) $0.02。
kurdtpage at gmail dot com
7 年前
新的(PHP7 起)'null 合并运算符' 允许使用简写 isset。你可以像这样使用它

<?php
// 获取 $_GET['user'] 的值,如果不存在则返回 'nobody'
//
$username = $_GET['user'] ?? 'nobody';
// 这等同于:
$username = isset($_GET['user']) ? $_GET['user'] : 'nobody';

// 合并可以链接:这将返回 $_GET['user']、$_POST['user'] 和
// 'nobody' 中第一个定义的值。
$username = $_GET['user'] ?? $_POST['user'] ?? 'nobody';
?>

引用自 https://php.net/manual/en/migration70.new-features.php#migration70.new-features.null-coalesce-op
a dot schaffhirt at sedna-soft dot de
15 年前
你可以安全地使用 isset 来直接检查对象的属性和子属性。所以,不用写

isset($abc) && isset($abc->def) && isset($abc->def->ghi)

或者用更短的形式

isset($abc, $abc->def, $abc->def->ghi)

你只需要写

isset ($abc->def->ghi)

不会产生任何错误、警告或通知。

示例
<?php
$abc
= (object) array("def" => 123);
var_dump(isset($abc)); // bool(true)
var_dump(isset($abc->def)); // bool(true)
var_dump(isset($abc->def->ghi)); // bool(false)
var_dump(isset($abc->def->ghi->jkl)); // bool(false)
var_dump(isset($def)); // bool(false)
var_dump(isset($def->ghi)); // bool(false)
var_dump(isset($def->ghi->jkl)); // bool(false)

var_dump($abc); // object(stdClass)#1 (1) { ["def"] => int(123) }
var_dump($abc->def); // int(123)
var_dump($abc->def->ghi); // null / E_NOTICE: Trying to get property of non-object
var_dump($abc->def->ghi->jkl); // null / E_NOTICE: Trying to get property of non-object
var_dump($def); // null / E_NOTICE: Trying to get property of non-object
var_dump($def->ghi); // null / E_NOTICE: Trying to get property of non-object
var_dump($def->ghi->jkl); // null / E_NOTICE: Trying to get property of non-object
?>
yaogzhan at gmail dot com
19 年前
如果你有

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

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

以及
<?PHP
$foo
= new Foo;
echo isset(
$foo->bar);
?>
将始终输出 'false'。因为 isset() 接受变量作为参数,但在这种情况下,$foo->bar 不是变量。它是 Foo 类 __get() 方法返回的值。因此,isset($foo->bar) 表达式将始终等于 'false'。
beuc at beuc dot net
17 年前
"empty() 是 (boolean) var 的反义词,除了当变量未设置时不会产生警告."

所以本质上
<?php
if (isset($var) && $var)
?>

<?php
if (!empty($var))
?>
是一样的,不是吗?:)

!empty() 模仿了之前发布的 chk() 函数。
mandos78 AT mail from google
16 年前
小心这个函数 "ifsetfor",它由 soapergem 提供,通过引用传递意味着如果,就像示例 $_GET['id'] 一样,参数是数组索引,它将在原始数组中创建(值为 null),从而导致后续代码出现潜在问题。至少在 PHP 5 中是这样。

例如

<?php
$a
= array();
print_r($a);
ifsetor($a["unsetindex"], 'default');
print_r($a);
?>

将输出

Array
(
)
Array
(
[unsetindex] =>
)

任何 foreach 或类似的循环在调用前后都会有所不同。
ayyappan dot ashok at gmail dot com
8 年前
返回值
如果 var 存在且具有非 NULL 值,则返回 TRUE,否则返回 FALSE。

<?php
$a
=NULL;
$b=FALSE; // 输出为 TRUE。
$c=TRUE;
$d='';
$e="";
if(isset(
$b)):
echo
"TRUE";
else:
echo
"FALSE";
endif;
?>
谁能清楚地解释一下。
soywiz at php dot net
18 年前
有时你需要检查数组是否包含某些键。要实现这一点,你可以使用 "isset",例如:isset($array['key1'], $array['key2'], $array['key3'], $array['key4'])
你必须每次都写 $array,如果你每次都使用同一个数组,这会很重复。

使用这个简单的函数,你可以检查数组是否包含某些键

<?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;
}
?>

用法:isset_array($array, 'key1', 'key2', 'key3', 'key4')
第一个参数是数组;后面的参数是你要检查的键。
Cuong Huy To
13 年前
1) 注意,isset($var) 无法区分 $var 未定义或为 null 的两种情况。以下是代码示例。

<?php
unset($undefined);
$null = null;
if (
true === isset($undefined)){echo 'isset($undefined) === true'} else {echo 'isset($undefined) === false'); // 'isset($undefined) === false'
if (true === isset($null)){echo 'isset($null) === true'} else {echo 'isset($null) === false'); // 'isset($null) === false'
?>

2) 如果你想区分未定义的变量和已定义但值为 null 的变量,可以使用 `array_key_exists`。

<?php
unset($undefined);
$null = null;

if (
true !== array_key_exists('undefined', get_defined_vars())) {echo '$undefined does not exist';} else {echo '$undefined exists';} // '$undefined does not exist'
if (true === array_key_exists('null', get_defined_vars())) {echo '$null exists';} else {echo '$null does not exist';} // '$null exists'
?>
andreasonny83 at gmail dot com
9 年前
以下是一个使用多个参数的示例

<?php
$var
= array();
$var['val1'] = 'test';
$var['val2'] = 'on';

if ( isset(
$var['val1'], $var['val2'] ) && $var['val2'] === 'on' ) {
unset(
$var['val1'] );
}
print_r( $var );
?>

这将输出
Array
(
[val2] => on
)

以下代码通过两次调用 `isset` 来实现相同的效果

<?php
$var
= array();
$var['val1'] = 'test';
$var['val2'] = 'on';

if ( isset(
$var['val1'] ) && isset( $var['val2'] ) && $var['val2'] === 'on' ) {
unset(
$var['val1'] );
}
print_r( $var );
?>
packard_bell_nec at hotmail dot com
16 年前
注意:`isset()` 只检查变量,其他任何操作都会导致解析错误。换句话说,以下代码将无法正常工作:`isset(trim($name))`。

`isset()` 与 `is_null($var)` 相反,区别在于当变量未设置时不会产生警告。
francois vespa
13 年前
现在,以下是实现相同效果的方法(即,即使变量被设置为 null,`isset()` 仍然返回 true),适用于对象和数组。

<?php

// 数组

$array=array('foo'=>null);

return isset(
$array['foo']) || array_key_exists('foo',$array)
?
true : false ; // 返回 true

return isset($array['inexistent']) || array_key_exists('inexistent',$array)
?
true : false ; // 返回 false

// 静态类

class bar

{
static
$foo=null;
}

return isset(
bar::$foo) || array_key_exists('foo',get_class_vars('bar'))
?
true : false ; // 返回 true

return isset(bar::$inexistent) || array_key_exists('inexistent',get_class_vars('bar'))
?
true : false ; // 返回 false

// 对象

class bar
{
public
$foo=null;
}

$bar=new bar();

return isset(
$bar->foo) || array_key_exists('foo',get_object_vars($bar))
?
true : false ; // 返回 true

return isset($bar->inexistent) || array_key_exists('inexistent',get_object_vars($bar))
?
true : false ; // 返回 true

// stdClass

$bar=new stdClass;
$bar->foo=null;

return isset(
$bar->foo) || array_key_exists('foo',get_object_vars($bar))
?
true : false ; // 返回 true

return isset($bar->inexistent) || array_key_exists('inexistent',get_object_vars($bar))
?
true : false ; // 返回 true

?>
Ashus
15 年前
请注意,数组键区分大小写。

<?php
$ar
['w'] = true;

var_dump(isset($ar['w']),
isset(
$ar['W']));
?>

将报告
bool(true) bool(false)
Andrew Penry
19 年前
以下是如何测试一个变量是否已设置,无论它是否为 NULL 的示例。它利用了一个未设置的变量将抛出 E_NOTICE 错误,而初始化为 NULL 的变量则不会。

<?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();

?>

输出
True False

问题是,`set_error_handler` 和 `restore_error_handler` 的调用不能放在函数内部,这意味着每次测试都需要额外添加两行代码。并且,如果在 `set_error_handler` 和 `restore_error_handler` 之间的其他代码中存在任何 E_NOTICE 错误,它们将无法被正确处理。一种解决方案是...

<?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();

?>

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

此方法仅处理 var_exists,但会增加大量开销。每次发生 E_NOTICE 错误时,都会将它所来自的文件加载到数组中。
Hayley Watson
7 年前
如果你认为 isset() 表示给定变量是否具有值,并记得 NULL 旨在表示值_缺失_(如手册页面中所述,有点笨拙),那么它的行为一点也不不一致或令人困惑。

它不仅仅是为了检查未初始化的变量——很多时候这些只是由于代码编写粗心。变量可能会以其他方式无法获得值(例如,它应该保存从函数调用返回的值,但函数没有值要返回),在这种情况下,取消初始化变量将不可行,甚至没有意义(例如,根据对返回值的处理方式)。
eckoson at gmail dot com
1 年前
如果你对 isset() 关于 null 值的行为感到厌烦,这里有一个方便的函数供你使用。它类似于 array_key_exists,但更灵活,可以检查多个数组中的多个数组键。
非递归!
在 php 8.1.6,linux 上测试
<?php
/**
* is_set
* @author DJ Eckoson
* @link @eckosongh Facebook Page
* 检查变量名是否在全局空间中设置,或者它们是否存在作为键并返回它们是否被设置(即使它们的值为 null)
* @param string $var_name
* 要检查的第一个变量的名称
* @param array|null|string
* 可选的数组,用于检查键(如果为 null,则从 $GLOBALS 检查)或
* 要检查的其他变量名或
* 其他变量名及其右侧关联的数组(对全局变量使用 null,如果它是最后一个参数,则可选)
* 检查以下示例
*/
function is_set(string $var_name, array|null|string ... $args): bool {
$vars[$var_name] = null;
if (
array_key_exists(0, $args)) {
if (
is_array($args[0])) {
$vars[$var_name] = $args[0];
} elseif (
is_string($args[0])) {
goto
main;
}
unset(
$args[0]);
}
main:
if (
$args) {
$args = array_reverse($args);
$cur_array = null;
array_walk($args, function ($value) use (&$cur_array, &$vars): void {
if (!
is_string($value)) {
$cur_array = $value;
} else {
$vars[$value] = $cur_array;
}
});
}
foreach (
$vars as $name => $array) {
if (!
array_key_exists($name, $array??$GLOBALS)) return false;
}
return
true;
}

// 示例
$arr1 = range(0, 5);
$arr2 = [
'a' => 1,
'b' => 2,
'c' => 'hELLO wORLD!'
];
$gender = 'male';
$age = 12;
var_dump(is_set('age')); // true
var_dump(is_set('age', null)); // true
var_dump(is_set('age', $arr1)); // false
var_dump(is_set('age', array())); // false
var_dump(is_set('age', array('age' => 48))); // true
var_dump(is_set('age', 'arr1', null, 'b', $arr2, 0, 3, 4, $arr1, 'gender')); // true
var_dump(is_set('age', 'arr1', null, 'b', $arr2, 0, 3, 4, $arr1, 'gender', null)); // true

$c=$d=$e=$a=2;
$arr = [1,4];
var_dump(is_set('a', 'c', null, 0, 1, $arr)); // true
var_dump(is_set('a', 'c', null, 0, 4, $arr)); // false
?>
注意
它不适用于在函数内本地声明的变量;
但是你可以在函数中使用它来检查数组键是否存在
Anl zselgin
15 年前
注意:因为这是一个语言结构,而不是函数,所以不能使用变量函数调用它。

那么为什么它在“变量处理函数”下呢?也许应该有一些用于语言结构的良好文档字段。
randallgirard at hotmail dot com
17 年前
isset 的意外结果一直让我很沮丧。因此,它并没有像你预期的那样工作(如文档中所述),当前作用域中具有 null 值的变量将返回 false。

这是一个快速的解决方案,也许还有更好的方法,但这是我的解决方案......

<?php
function is_set( $varname, $parent=null ) {
if ( !
is_array( $parent ) && !is_object($parent) ) {
$parent = $GLOBALS;
}
return
array_key_exists( $varname, $parent );
}
?>

因此,$varname 应该是一个要检查的变量的混合值,$parent 可以是一个数组或对象,它将默认为 GLOBAL 作用域。有关更多信息,请参见 array_key_exists 的文档。

这将允许检查变量是否在当前作用域、对象或数组中……无论它是否为空、假、真或任何值。它依赖于 ARRAY_KEY_EXISTS 的功能,该功能也适用于对象。欢迎大家改进它;D
Tee Cee
17 年前
针对 2006 年 2 月 10 日 06:02 的回复,isset($v) 在所有(可能除了有问题的)情况下都等同于 !is_null($v)。并且,它实际上并没有按照我的定义“$v 如果 unset($v) 没有影响,则 $v 被设置”来测试变量是否被设置。

<?php
unset($c); // 强制 $c 取消设置
var_dump($a=&$c); // NULL,但这实际上将 $a 和 $c 设置为“相同”的 NULL。
var_dump(isset($c)); // bool(false)
var_dump($a = 5); // int(5)
var_dump($c); // int(5)

unset($c);
var_dump($a=&$c); // NULL
var_dump(isset($c)); // bool(false)
unset($c);
var_dump($a = 5); // int(5)
var_dump($c); // NULL
?>

在以下示例中,我们看到了一种测试变量是否真正设置的替代方法。
<?php
var_dump
(array_key_exists('c',get_defined_vars())); // false
var_dump(isset($c)); // 也是 false
var_dump($c); // 对 $c 进行一些操作...
var_dump((string)$c);
var_dump(print_r($c,true));
var_dump($a=$c);
var_dump(array_key_exists('c',get_defined_vars())); // ... 仍然是 false
var_dump($c = NULL); // 这将设置 $c
var_dump(array_key_exists('c',get_defined_vars())); // true!
var_dump(isset($c)); // false; isset() 仍然表示它未设置
unset($c); // 实际上取消设置它
var_dump(array_key_exists('c',get_defined_vars())); // false
var_dump($a=&$c);
var_dump(array_key_exists('c',get_defined_vars())); // true!
unset($c); // 再次取消设置它
var_dump(&$c); // &NULL
var_dump(array_key_exists('c',get_defined_vars())); // true!
?>

显然,空值占用空间(否则它们不会出现在 get_defined_vars 中)。另外,请注意,&$v 如果它未设置,则会将 $v 设置为 NULL。
To Top