Странная ошибка, когда переменная принимает значение объекта - PullRequest
4 голосов
/ 04 августа 2011

Это так:

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

4 голосов
/ 04 августа 2011

Какое значение $var после получения $obj->data->field?

согласно справочной странице"0" и "0.0" и другие считаются пустыми.

4 голосов
/ 04 августа 2011

Полагаю, вы ожидаете, что empty вернет true только для NULL, тогда как фактически весь набор значений считается "пустыми значениями"; из документа :

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)
4 голосов
/ 04 августа 2011

Какова ваша переменная? 0, false, пустые строки и некоторые другие считаются пустыми. Вместо этого попробуйте isset () и посмотрите, работает ли он. В этом случае вам придется распечатать ваше сообщение, когда isset () имеет значение false.

3 голосов
/ 04 августа 2011

Мое предположение: $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#
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...