试图确定变量是否是这些可能结果之一:
- 有一个非零值
- 具有null的值
- 根本不设置
我从此开始:
if ( isset($value) )
var_dump("It's set");
else
var_dump("Not set");
涵盖该变量是否已设置。但是,我也想覆盖该变量是否为null。知道以下内容:
$value = null;
var_dump( isset($value) ); // Returns false
因此,由于设置未设置,返回零值。所以我不能这样做:
if ( isset($value) )
var_dump("It's set");
else if ( is_null($value) ) // This throws exception if $value is not set
var_dump("It's null");
else
var_dump("Not set");
也不能这样做:
if ( isset($value) ) {
var_dump("It's set");
} else {
if ( is_null($value) )
var_dump("It's null"); // Also throws an exception because $value is not set
else
var_dump("Not set");
}
起初,我认为有一种简单的方法可以做到这一点,但它正在避开我。问题归结为检测到null
值未被设置为未设置,但是您无法检查使用is_null()
是否为非设定值。
如何解决这个问题?我想念明显的东西吗?我需要求助于try catch
吗?
,如果您很好奇,我会问这个问题,因为在某些情况下,开发人员可以将变量传递给某些东西,而我需要能够区分开发人员是用值还是一个值或一个值传递的变量零值或根本没有通过。
我可以给出的最好的答案是,您不应该尝试依靠某些设置,而是构建代码,以便它总是始终设置。
刚刚看到了您的编辑。
函数参数可以具有默认值,因此您知道它总是设置的。function myFun($variable = null)
将确保访问$变量永远不会抛出异常。
编辑:如果您确实需要知道是否传递了参数,请使用func_get_args()。它返回一个数组,您可以检查其大小。
function foo($bar) {
var_dump(func_get_args());
}
foo();
foo('foo');
给出输出:
array(0) {
}
array(1) {
[0] =>
string(3) "foo"
}
顺便说一句,呼叫foo()没有参数会发出错误:
PHP Warning: Missing argument 1 for foo(), called in /Users/pittsd/dev/cbsi/fly/cnet/expirement/expirement.php on line 6 and defined in /Users/pittsd/dev/cbsi/fly/cnet/expirement/expirement.php on line 2
Warning: Missing argument 1 for foo(), called in /Users/pittsd/dev/cbsi/fly/cnet/expirement/expirement.php on line 6 and defined in /Users/pittsd/dev/cbsi/fly/cnet/expirement/expirement.php on line 2
进一步回答您的问题:
<?php
function foo() {
if (func_get_args()) {
$value = func_get_args()[0];
if ($value === null) {
echo "Have a null value. ". PHP_EOL;
} else {
echo "Have a value: ".$value. PHP_EOL;
}
}
else {
echo "No value passed in.". PHP_EOL;
}
}
foo(null);
foo('foo');
foo();
输出:
Have a null value.
Have a value: foo
No value passed in.
一般您可以执行检查而无需以这种方式进行检查:
if(isset($value)) {
if($value===null) {
// exists and null
}
else {
// exists and not null
}
}
else {
// doesn't exists
}
编辑:
您在评论中提到的上面的代码不会有效,但是我有另一个解决方案来检查是否存在变量并且为null:
var_dump(array_key_exists('value', get_defined_vars())); // false
$value = null;
var_dump(array_key_exists('value', get_defined_vars())); // true
if (!empty($value) ) // if is not empty
or
if (empty($value)) // if is empty
未定义的变量错误是通知错误,不会停止您的脚本执行。
如果您用try-catch {}您的if子句包围,它也不会停止,因此您可以抑制此错误。通常在生产环境上注意到错误是隐藏的。
如果是:
,您的代码将完美地工作if($value == null) { // or @$value == null for suppressing this error ?
if (count(error_get_last()) == 0) {
echo 'null';
} else {
echo 'value is not set';
}
} else {
echo 'value is: '. $value;
}
您可以检查测试NULL后是否有错误消息,如果有的话,则意味着未设置。
让我们测试它。
首先,我们什么都没有。它打印:
value is not set
现在我们通过$value = null;
。它打印:
null
现在我们通过$value = 'something';
。它打印:
value is: something