Почему empty ожидает T_PAAMAYIM_NEKUDOTAYIM, когда задается переменная? - PullRequest
4 голосов
/ 01 марта 2011
<?php
define('foo', 'bar');

if (empty(foo)) {
  echo 'qux';
}

http://codepad.org/G1TSK1c6
Ошибка разбора: синтаксическая ошибка, неожиданный ')', ожидание T_PAAMAYIM_NEKUDOTAYIM в строке 4

Я знаю, что empty() позволяет только переменнымбыть передан в качестве аргумента, но почему он ожидает T_PAAMAYIM_NEKUDOTAYIM (то есть ::), когда я даю ему константу?

Ответы [ 5 ]

4 голосов
/ 01 марта 2011

Следующая логическая вещь, которую парсер хочет, это ::, потому что foo не является переменной.

if (empty(foo::$bar)) {
}

Единственное, что работает, когда empty() не передана переменная. Ваш пример оценивается как empty(bar), где анализатор предполагает, что bar является именем класса, и теперь ожидает статическую переменную-член.

3 голосов
/ 05 января 2014

Я посмотрел на это, попробовал на моей локальной установке PHP и угадайте что?Работало без сбоев (PHP 5.5.6).Попробовав один и тот же код на разных версиях PHP, я обнаружил, что он работает не на всех версиях PHP <5.5.x и работает иначе. </p>

Итак, я перешел к документации PHP, более конкретно к его журналу изменений из5.4.x до 5.5.x, и нашел это:

http://www.php.net/manual/en/migration55.new-features.php#migration55.new-features.empty

empty () поддерживает произвольные выражения

Передачапроизвольное выражение вместо переменной to empty () теперь поддерживается.Например:

if (empty(TRUE)) {
    echo "This will NOT be printed.\n";
}

if (empty(FALSE)) {
    echo "This will be printed.\n";
}

Вышеприведенный пример выведет:

Это будет напечатано.

Так что если вы работаетеPHP> = 5.5.x, тогда это не будет проблемой.

Вы можете протестировать код на разных версиях PHP, используя этот сервис: http://sandbox.onlinephpfunctions.com/. Я не смог, на всю жизнь, выясните, как сохранить примеры кода (я всегда терпел неудачу при проверке кода, даже если он очень прост - думаю, что-то МОЖЕТ сломаться с их стороны).

3 голосов
/ 15 ноября 2011

Увидел это во время некоторых исследований, хотя я знаю, что это удар, я подумал, что лучше проясню это.

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

empty() ожидает проверки чего-то переменного; константа не является переменной, поэтому она не включена в список возможных синтаксисов, которые могут быть переданы этой конструкции, что имеет смысл, поскольку в противном случае вы бы делали что-то нелогичное (проверяя пустоту в константе).

Единственные другие возможные переменные, которые у нас есть в PHP, это старые добрые переменные и свойства класса, так как они взаимозаменяемы, соответствующие синтаксисы могут быть представлены так:

* * 1010

Это означает, что если вы передаете константу, PHP будет читать это как имя класса и, следовательно, ожидает токен двойного двоеточия '::', поэтому и эта ошибка имеет смысл.

Надеюсь, это было несколько проницательно; -)

2 голосов
/ 01 марта 2011

empty() ожидает переменные, а не константы. Вы должны использовать defined() для констант.

1 голос
/ 01 марта 2011

Просто, хотя, но я думаю, что эта ошибка выдается при разборе кода.

foo, не является ни переменной, ни строкой, поэтому в контексте анализа следующее решение можетбыть атрибутом класса., но это не потому, что нет ::, но это должно быть потому, что здесь не следует использовать константы, а он остается атрибутом или методом класса.

...