9

Я недавно начал использовать Zend Studio, который сообщил, как предупреждение следующего типа кода: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 в настоящее время присваивается $ а, в свою очередь, возвращает 1 к утверждению в то время, вместо того, чтобы проверяется против $ a и возвращает false в оператор while, когда $ a не является 1.

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

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

Из поддона, в огонь.

ответ

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

+1 простой, сладкий. Делает намерение намерения выражения более ясным и подавляет предупреждение от студии – Fatmuemoo

+0

идеальное решение, работает для меня, спасибо –

6

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

например:

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

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

+0

Это, конечно, связано с выбором PHP = (equals) в качестве оператора присваивания, а не для: = (двоеточие равно). – garrow

+0

Выбор PHP был под влиянием C. Как и любой другой язык. Не обвиняйте PHP в том, что C сделал популярным. – epochwolf

+2

Одним из способов обнаружения такого рода ошибок является инвертирование оператора: '1 == $ a'. PHP выдает ошибку, потому что левая часть не назначается. – Maxence

0

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

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

1

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

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

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

0

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

8

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

+0

Гораздо лучший вариант, чем принятый ответ IMO, +1 – Ing

+0

На самом деле, я решил пойти с принятым ответом, потому что это функционально более звук. Я буду избегать выполнения заданий как условных. –

2

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

1

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

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

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

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

Очистка предупреждение довольно легко, просто назначая результаты, а затем сравнивая его так:

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

Вместо:

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

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

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

Смежные вопросы