PHP Conference Japan 2024

isset

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

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

描述

isset(混合 $var, 混合 ...$vars): 布尔值

确定变量是否被视为已设置,这意味着变量是否已声明且不同于 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()重载方法,则会调用该方法。

参见

添加注释

用户贡献的注释 17 条注释

p_ignorethis_lbowers at gmail dot com
8 年前
我也很失望地发现,如果 ($foo == null),isset($foo) 会返回 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 开始)“空合并运算符”允许使用简写 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
16 年前
您可以安全地使用 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 年前
小心使用 soapergem 的这个函数“ifsetfor”,通过引用传递意味着如果,像示例 $_GET['id'] 一样,参数是数组索引,它将在原始数组中创建(具有 null 值),从而导致后续代码出现潜在问题。至少在 PHP 5 中是这样。

例如

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

将打印

数组
(
)
数组
(
[unsetindex] =>


)

任何 foreach 或类似循环在调用前后都会有所不同。
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')
第一个参数是数组;后面的参数是要检查的键。
ayyappan dot ashok at gmail dot com
8 年前
返回值
如果变量存在且值不为 NULL,则返回 TRUE,否则返回 FALSE。

<?php
$a
=NULL;
$b=FALSE; //输出结果为 TRUE。
$c=TRUE;
$d='';
$e="";
if(isset(
$b)):
echo
"TRUE";
else:
echo
"FALSE";
endif;
?>
能否有人清晰地解释一下。
Hayley Watson
7 年前
如果您将 isset() 视为指示给定变量是否有值,并回忆起 NULL 用于指示值_不存在_(如其手册页上有些笨拙地所说),那么它的行为一点也不矛盾或令人困惑。

它不仅仅用于检查未初始化的变量——很多时候这些变量仅仅是由于代码编写不规范造成的。变量可能没有值的其他方式(例如,它应该保存从函数调用返回的值,但函数没有值要返回),在这些情况下,不初始化变量不是一种选择,甚至没有意义(例如,取决于如何使用返回值)。
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_exist

<?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'
?>
packard_bell_nec at hotmail dot com
16 年前
注意:isset() 仅检查变量,其他任何内容都会导致解析错误。换句话说,以下方法无效:isset(trim($name))。

isset() 与 is_null($var) 相反,除了在变量未设置时不会生成警告。
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 错误时,它源自的文件都将加载到数组中。
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

?>
[email protected]
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 );
?>

这将输出
数组
(
[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 );
?>
[email protected]
1 年前
如果您对 isset() 在处理 null 值时的行为感到困扰,这里有一个方便的函数供您使用。它类似于 array_key_exists,但更灵活,可以跨多个数组检查多个数组键。
非递归!
在 php 8.1.6,linux 上测试


<?php
/**
* is_set
* @author DJ Eckoson
* @link @eckosongh Facebook 页面
* 检查变量名称是否在全局空间中设置或作为键存在,并返回它们是否已设置(即使它们的值为 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 年前
注意:因为这是一个语言结构,而不是函数,所以不能使用变量函数来调用它。

那么为什么它在“变量处理函数”下?也许应该为语言结构提供一些良好的文档字段。
To Top