如何在php中判断变量是null还是未定义

时间:2011-08-01 23:03:32

标签: php

是否可以创建单个函数来判断变量是否为NULL或在PHP中是否未定义?我会将变量传递给函数(如果需要,可以通过引用),但直到运行时我才知道变量的名称。

isset()is_null()不区分NULL和undefined array_key_exists要求您在编写代码时知道变量的名称 而且我还没有找到一种方法来确定变量的名称而不定义它。

修改

我也意识到通过引用传递变量会自动定义它。

精化

通过收集这些答案和评论,我确定我的问题的简短答案是"否"。感谢您的所有输入。

以下是我需要这个的原因的一些细节:

我创建了一个名为LoadQuery()的PHP函数,它从查询数组中提取特定的SQL查询,然后准备将其提交给MySQL。最重要的是,我扫描查询中的变量(如$UserID),然后用当前范围内的值替换它们。在创建此函数时,我需要一种方法来确定是否已声明变量,并且为NULL,为空或具有值。这就是我在运行时之前可能不知道给定变量的名称的原因。

8 个答案:

答案 0 :(得分:4)

使用PHP - Differenciate an undefined variable from a null variable

中的修改示例

我们可以区分它:



app_name = 'getimg'
urlpatterns = [
    # ex: /polls/
    path('', views.getimg, name='getimg'),

    path('gettext/', views.gettext, name='gettext'),
    path('success', views.success, name = 'success'),
]

urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

打印:

app_name = 'getimg'
urlpatterns = [
    # ex: /polls/
    path('', views.getimg, name='getimg'),

    path('gettext/', views.gettext, name='gettext'),
    path('success', views.success, name = 'success'),
]

urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

我们可以使用ng-true-value="'{{d.Company}}'" 来检测这两种情况

答案 1 :(得分:2)

您不能将这种逻辑包装在函数或方法中,因为函数签名中定义的任何变量都将被隐式“设置”。尝试这样的事情(包含代码气味)

function exception_error_handler($errno, $errstr, $errfile, $errline ) {
    throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
}
error_reporting(E_ALL);
set_error_handler("exception_error_handler");

try {
    if (null === $var) {
        // null your variable is, hmmm
    }
} catch (ErrorException $e) {
    // variable is undefined
}

答案 2 :(得分:2)

在PHP中,通常将未设置或未设置的变量视为nullnull的含义是“没有价值”。 “无值”与值空白之间存在明显差异。例如,如果用户提交的表单中包含foo=&bar=baz,则$_GET['foo']设置为空字符串""的值,这与null明显不同,后者将是值'foo'对于除'bar'unset以外的任何密钥。

尽管如此,可以查明某个变量是否未设置或true,尽管他们总是评估为is_null使用is_nullissetecho array_key_exists( $variableName, $theArray ) ? 'variable was set, possibly to null' : 'variable was never set'; 的否定,但如果未设置该值则会抛出通知。

一种方法是如果你在某种数组中有变量:

$GLOBALS

如果需要检查全局变量,请使用echo array_key_exists( $variableName, $GLOBALS ) ? 'variable exists in global scope' : 'this global variable doesn\'t exist'; 数组:

is_null

我想出的替代方法是确定变量是否已设置更多涉及,并且实际上没有必要,除非这是必须具有的特征(其中)你应该能够毫无困难地构建它。)

它依赖于errors在未设置变量时触发通知的事实。添加一个错误处理程序,将Exceptions转换为try...catch...,并使用catch块来捕获抛出的异常并在catch语句中设置一个标志。在null块之后执行依赖此功能的代码。

如果你问我这是一个肮脏讨厌的黑客,而且完全没必要,因为unset应被视为与{{1}}变量相同。

答案 3 :(得分:2)

基本上答案是否定的。您可以创建一个函数来判断运行时变量是null还是未定义。 ('运行时变量'是指编码时你还不知道的变量。请参阅上面问题中的精化

相关观察:

  • 无法在运行时检索变量的名称而不给它赋值,从而声明它。
  • 如果您通过引用而不是按值传递变量,则会自动声明它。那么在函数中你不能回过头来确定它是否在你传递它之前被声明了。
  • 您可以使用array_key_exists('variable_name', $GLOBALS)作为@zzzzBov陈述,查看是否已声明变量,但如果您在编码时知道变量的名称。

可能的'脏'解决方案

  • 正如@Phil(和@zzzzBov)所解释的那样,你可以使用一个杂乱的技巧来捕获在引用未声明的变量时会引发的错误消息。

  • 我还考虑过这样一种方法:记下$GLOBALS中的所有键,然后在目标变量中存储一个唯一值(首先记录它的原始值以供以后使用)。然后搜索$GLOBALS寻找该唯一值以确定变量AND的名称(通过与之前的$GLOBALS比较)确定变量是否存在之前。但这似乎也是混乱和不可靠的。

答案 4 :(得分:1)

您可以使用以下命令获取当前范围中已定义变量的数组:

get_defined_vars();

答案 5 :(得分:0)

这仅适用于全局定义的变量。由于作用域,它不能用于函数中的局部变量或类属性,但当然它只有一行,所以你可以将它复制到一个函数中。

function isNullOrUndefined($variable_name) {
  global $$variable_name;
  if (!isset($$variable_name) || is_null($$variable_name)) {
    return true;
  }
  return false;
}

$foo = "foo";
$bar = null;

isNullOrUndefined("foo") //false
isNullOrUndefined("bar") //true
isNullOrUndefined("baz") //true

答案 6 :(得分:0)

这是怎么回事?

try {
    $undefined_var
} catch (Exception $ex) {
    $is_undefined = true;
}
if(empty($is_undefined)){ ... }

答案 7 :(得分:0)

如果您的PHP版本大于或等于5.2,则以下函数可以执行此操作:

$a = NULL;  // comment this line and you will see an indication of 'Undefined'
$b = $c;  // generates an error that must be neutralized, before testing $a variable

/* possible intermediate code */

@trigger_error('do not consider this notice');  // neutralize last error associated with $c (push it down in the stack)
$status = @check_last_error_info( $a );  // new error associated with $a
echo $status;

function check_last_error_info() {
    $last_error = error_get_last();  // capture new error
    if ( $last_error['type'] == 8 && strpos($last_error['message'], 'Undefined variable:') === 0 ) {
        return 'Undefined variable';
    } else {
        return 'Defined variable';
    }
}

请注意,在调用函数之前,必须有一个trigger_error操作。否则,您可能会捕获代码其他部分生成的错误。