就是这样:
$var = $obj->data->field;
echo $var; // works, I get the value of 'field'
if(empty($var)) echo '$var is empty!'; // I get this message too. wtf?
这里有什么问题?为什么empty()返回true?
答案 0 :(得分:4)
我猜你只会为true
返回空NULL
,而实际上整套值都被认为是“空值”; from doc:
The following things are considered to be empty:
* "" (an empty string)
* 0 (0 as an integer)
* 0.0 (0 as a float)
* "0" (0 as a string)
* NULL
* FALSE
* array() (an empty array)
* var $var; (a variable declared, but without a value in a class)
答案 1 :(得分:4)
你的变量设置为什么? 0,false,空字符串和其他一些被认为是空的。尝试使用isset(),看看它是否有效。在这种情况下,当isset()为false时,您必须打印消息。
答案 2 :(得分:4)
获取$var
之后$obj->data->field
的值是多少?
根据man page“0”和“0.0”,其他都被认为是空的。
答案 3 :(得分:3)
我的猜测:$obj->data->field
“是”一个对象,并且该类没有实现__isset()方法,因为您需要它以便以这种方式使用empty()。
什么是
echo "type:", gettype($obj->data), " class:", get_class($obj->data);
打印?
展示效果的自包含示例:
<?php
class Bar {
public $flag=false;
public function __isset($key) {
return $this->flag;
}
public function __get($key) {
return '#'.$key.'#';
}
}
$foo = new StdClass;
$foo->bar = new Bar;
echo empty($foo->bar->test) ? 'empty':'not empty', ", ", $foo->bar->test, "\n";
$foo->bar->flag = true;
echo empty($foo->bar->test) ? 'empty':'not empty', ", ", $foo->bar->test, "\n";
打印
empty, #test#
not empty, #test#