变量获取对象值时的奇怪错误

时间:2011-08-04 12:55:06

标签: php variables

就是这样:

$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?

4 个答案:

答案 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#