Zend Studio сообщает о предупреждении:Задание в рабочем состоянии.Неужели это так плохо?

StackOverflow https://stackoverflow.com/questions/630035

Вопрос

Недавно я начал использовать 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 не будет предупреждать об этом!

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

Со сковороды - на огонь.

Это было полезно?

Решение

while (($row = $sql->db_Fetch("MYSQL_ASSOC")) != false)

Другие советы

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

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

например:

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

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

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

Как вы хорошо знаете, 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 )) {

Как видите, вам не нужны дополнительные наборы кода.

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

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

//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);
}

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

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

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

а не

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

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

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

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

Нет, мои друзья все назначения в условии генерируют это предупреждение. Я не хочу отключать это полностью, так как = вместо == это синтаксическая ошибка, к которой я склонен. Что касается вопроса о том, почему это необходимо, я буду использовать пример из руководства по 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 и предложить, чтобы они изменили пример, чтобы использовать лучший стиль. Возможно, некоторые из вас могли бы сделать то же самое, и мы могли бы улучшить документацию?!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top