isset() docs人中:

isset() will return FALSE if testing a variable that has been set to NULL.

基本上,isset()根本不判断变量是否被设置,而是判断它是否被设置为NULL以外的任何值.

鉴于此,判断变量是否存在的最佳方法是什么?我试过这样的方法:

if(isset($v) || @is_null($v))

(当未设置$v时,@是避免警告所必需的),但is_null()isset()有一个类似的问题:它在未设置的变量上返回TRUE!而且似乎:

@($v === NULL)

@is_null($v)差不多,所以也算出来了.

我们应该如何可靠地判断PHP中是否存在变量?


编辑:在PHP中,未设置的变量和设置为NULL的变量之间有明显的区别:

<?php
$a = array('b' => NULL);
var_dump($a);

PHP显示$a['b']存在,并且有一个NULL值.如果您添加:

var_dump(isset($a['b']));
var_dump(isset($a['c']));

您可以看到我所说的isset()函数的模糊性.下面是这三个var_dump()s的输出:

array(1) {
  ["b"]=>
  NULL
}
bool(false)
bool(false)

进一步编辑:两件事.

第一,用例.将数组转换为SQL UPDATE语句的数据,其中数组的键是表的列,数组的值是应用于每列的值.表中的任何列都可以包含NULL值,通过在数组中传递NULL值来表示.您可以找到一种方法来区分不存在的数组键和设置为NULL的数组值;这就是不更新列的值和将列的值更新为NULL之间的区别.

其次,对于我上面的用例和任何全局变量,Zoredache's answer,array_key_exists()都可以正常工作:

<?php
$a = NULL;
var_dump(array_key_exists('a', $GLOBALS));
var_dump(array_key_exists('b', $GLOBALS));

输出:

bool(true)
bool(false)

因为这可以正确地处理几乎所有我能看到的变量,在不存在的变量和设置为NULLI'm calling 101 the official easiest way in PHP to truly check for the existence of a variable的变量之间存在任何歧义.

(我唯一能想到的另一种情况是类属性,其中有property_exists(),根据its docs,其工作原理与array_key_exists()类似,因为它正确区分了未设置和设置为NULL.)

推荐答案

如果要判断的变量在全局范围内,可以执行以下操作:

array_key_exists('v', $GLOBALS) 

Php相关问答推荐

自定义通知在Woocommerce我的帐户自定义端点页面上不起作用

LaravelEloquent 的地方条件父/子与第三模型多对多

如何使用ms graph php sdk v2列出具有已知路径的DriveItem的子项

在WooCommerce我的帐户部分添加带有自定义链接的自定义菜单项

来自POST请求的(无效)json字符串中的奇怪字符(编码问题)

在WooCommerce获取所有具有全球产品属性品牌的简单产品

从两个日期创建日期范围,然后为范围中的每个日期复制子数组

PHP -流加密启用服务器切断字节

获取作者';在WordPress中使用PHP

用ajax获取文件 - CORS问题&;设置缓存?

调用模型[App\Models\Employee]上未定义的关系[title]

Filament v3:具有 hasMany 和 BelongsTo 的关系管理器

如何在 apache Laragon - laravel 10 中允许方法 DELETE?

调用未定义的方法 mysqli::execute_query()

使用 wp_footer 挂钩添加一些 CSS 不起作用

如何在 Phpunit 的静态提供程序中创建测试双打?

如何用 php ML 解决这个问题?

使用 PHP 正则表达式从仅包含具有现有顺序的顶级标签的 XML 文档中搜索和创建数组

按前 3 列对二维数组中的行数据进行分组,然后用逗号连接每组中的其余列

按数字然后按字符串对关联 PHP 数组进行排序