Zend Studio сообщает предупреждение: назначение в состоянии. Это так плохо? - PullRequest
9 голосов
/ 10 марта 2009

Я недавно начал использовать Zend Studio, которая сообщила как предупреждение следующий тип кода:

$q = query("select * from some_table where some_condition");
while ($f = fetch($q)) {
  // some inner workings
}

Чтобы остановить предупреждение, код должен быть написан так:

$q = query("select * from some_table where some_condition");
$f = fetch($q);
while ($f) {
  // some inner workings
  $f = fetch($q);
}

Почему это помечено как предупреждение? Это так плохо?

Я понимаю, что предупреждение может быть разработано, чтобы остановить такие ошибки:

$a = 1;
while ($a = 1) {
  // some inner workings
  $a++;
}

, который никогда не завершится, потому что 1 присваивается $ a, который, в свою очередь, возвращает 1 для оператора while, а не проверяется на $ a и возвращает false для оператора while, когда $ a не равно 1.

Легко сделать ошибку, которая может проверять предупреждение, предоставленное, но забывает добавить дополнительный $ f = fetch ($ q) в конце блока while во втором примере, что также приведет к циклу, который никогда не закончится. Если я изменю свой код, чтобы удалить предупреждение, а затем забуду добавить $ f = fetch ($ q) в конце блока while, Zend не будет предупреждать об этом!

Итак, удаляя предупреждение о распространенной ошибке, я настраиваю себя на другую распространенную ошибку.

Из кастрюли в огонь.

Ответы [ 8 ]

30 голосов
/ 05 апреля 2010
while (($row = $sql->db_Fetch("MYSQL_ASSOC")) != false)
8 голосов
/ 10 декабря 2010

Так что вам не придется переписывать весь ваш код без веской причины: Вы можете отключить обнаружение этой потенциальной ошибки программирования в Window | Настройки, PHP | Семантический анализ .

6 голосов
/ 10 марта 2009

Это, вероятно, помечено как предупреждение, потому что люди часто используют "=" по ошибке, когда они означают "==".

например:

$a = 1
while($a = 1) {
   $a++;
}

Это никогда не прекратится, хотя, если вы подумали, что написали "==", оно должно быть.

2 голосов
/ 12 августа 2011

Как вы хорошо знаете, Zend Studio построен на Eclipse, который является Java IDE. На языке Java нелегально делать что-то вроде этого:

String s;
while (s = getName()) {
    ...
}

Это потому, что даже если 'getName' возвращает нулевое значение, оно будет присвоено 's', и приведение между объектами и логическими значениями (что является обязательным типом для операторов условия) будет немного более субъективным, как в PHP, поэтому оно вызовет исключение во время компиляции.

Ситуация в PHP может отличаться, но по какой-то причине разработчики Zend решили оставить это предупреждение активным по умолчанию, вы можете отключить его, как упоминалось ранее, но я считаю, что оно поможет вам, когда произойдет реальное назначение в условии.

Очистить предупреждение довольно просто, просто присваивая результаты и сравнивая их следующим образом:

if (($result = $mysqli->query ( $query )) == true) {

Вместо:

if ($result = $mysqli->query ( $query )) {

Как видите, вам не нужны дополнительные связки кода.

В любом случае, это всего лишь предупреждение, вам не о чем беспокоиться.

2 голосов
/ 24 февраля 2011

Zend Studio пытается помочь вам в написании лучшего кода, который будет легче отлаживать. Отключение семантической проверки не является хорошей идеей, оно просто скрывает потенциальные проблемы, и вы упустите реальные проблемы. Это достойная причина! Не избегайте предупреждающих сообщений, игнорируя их, измените код, внедрив правильное решение.

1 голос
/ 28 сентября 2010

На самом деле, я полагаю, что на ваш вопрос уже был получен ответ. Но я думаю, что для решения вашей реальной проблемы это может помочь.

//i dont know what is returned if there are no more records to fetch...
//but lets assume it is a boolean value
while (($f = fetch($q))!= false)
{
    $this->doSomethingVeryImportantThatMakesYourBossHappy($f);
}

Это должно сработать, и сообщение "Назначение в условии" должно исчезнуть.

В качестве sidenote: используйте оператор равно, как при отрицании вещи. Вы также используете знак равенства с другими операторами, такими как

if ($falseness != false){$trueness = true}

а не

if ($falseness ! false){$trueness = false}

Это помогает мне всегда помнить, как сравнивать значения, а не присваивать им значения.

0 голосов
/ 30 сентября 2010

Нет, мои друзья Все назначения в условии генерируют это предупреждение. Я не хочу отключать это полностью, так как = вместо == это синтаксическая ошибка, к которой я склонен. Что касается вопроса о том, почему это необходимо, я буду использовать пример из руководства по PHP. Это из раздела «Улучшенные MySQL» расширения или mysqli:

$query = "SELECT Name, CountryCode FROM City ORDER by ID DESC LIMIT 50,5";

if ($result = $mysqli->query($query)) {

    /* fetch associative array */
    while ($row = $result->fetch_assoc()) {
        printf ("%s (%s)\n", $row["Name"], $row["CountryCode"]);
    }

к сожалению, я разработал свои функции базы данных, используя эту технику, и пытаюсь использовать их в Zend Studio. Эта ошибка появляется достаточно раз, чтобы быть настоящей болью. Я перефразирую предложения здесь, поскольку я ценю однозначный код, однако я также собираюсь перейти к руководству по PHP и предложить изменить пример, чтобы использовать лучший стиль. Возможно, некоторые из вас могли бы сделать то же самое, и мы могли бы улучшить документацию?!

0 голосов
/ 10 марта 2009

Причина, по которой это плохо, заключается в том, что многие люди используют "=", когда тогда имели в виду "=="

Оператор = вернет присвоение влево, поэтому, если вы используете if($x=true), будет запущен код внутри if, если вы используете if($x=false), код не будет выполняться. Это хитрый трюк, который может сохранить одну или две строки кода, но он также опасен, потому что если вы имели в виду if($x == false) и набрали if($x = false), это будет ошибка, которую может быть трудно отследить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...