Что такое волшебная функция для empty () в PHP? - PullRequest
6 голосов
/ 12 марта 2010

Это не должно быть __isset, потому что isset() - это не то же самое, что empty()

Ответы [ 4 ]

17 голосов
/ 12 марта 2010

Как сказано на этой странице :

__ isset () запускается вызовом isset () или empty () в недоступном свойства.

Не существует специального магического метода для empty ()

Если __isset () возвращает true, empty () затем вызовет __get () для проверки значения свойства.

4 голосов
/ 12 марта 2010

Как дополнение к ответу Inspire:

class Foo {
  public function __isset($name) {
    echo "public function __isset($name)\n";
    return 'bar'===$name;
  }
  public function __get($name) {
    echo "public function __get($name)\n";
    return 'bar'===$name ? 0 : NULL;
  }
}

$foo = new Foo;
echo empty($foo->foo) ? ' empty' : ' not empty', "\n";
echo empty($foo->bar) ? ' empty' : ' not empty', "\n";

вывод

public function __isset(foo)
 empty
public function __isset(bar)
public function __get(bar)
 empty

значение для первого свойства (foo) empty () вызвал только __isset (), который вернул false -> empty($foo->foo)===true
Для второго свойства (bar) было вызвано __isset (), и оно вернул true. Затем свойство выбирается с помощью __get () и интерпретируется как логическое значение (см. http://docs.php.net/language.types.type-juggling).. А поскольку (bool) 0 равно false, empty () также возвращает true для empty($foo->bar)

0 голосов
/ 12 марта 2010

не property_exists() работает для вас, если вы просто тестируете, существует ли переменная класса?

0 голосов
/ 12 марта 2010

Я думаю, в целом вы обнаружите, что следующее является эквивалентом PHP:

isset($variable[0])

Если, например, переменная является строкой, это обнаружит, что строка была пустой. Это будет работать аналогично для большинства примитивных типов (если не для всех).

...