Zend Studio relata aviso: Atribuição no estado. Isso é tão ruim?
Pergunta
Tenho recentemente começou a usar Zend Studio, que relatou como aviso o seguinte tipo de código:
$q = query("select * from some_table where some_condition");
while ($f = fetch($q)) {
// some inner workings
}
Para parar o aviso às necessidades de código a ser escrito assim:
$q = query("select * from some_table where some_condition");
$f = fetch($q);
while ($f) {
// some inner workings
$f = fetch($q);
}
Por que isso está marcado como um aviso? É tão ruim assim?
Eu entendo que o aviso pode ser projetado para erros de parada assim:
$a = 1;
while ($a = 1) {
// some inner workings
$a++;
}
que nunca vai terminar porque 1 está sendo atribuído a $ a qual, por sua vez retorna 1 para o while, em vez de ser testado contra $ a e retornar false ao while quando $ a não é 1.
erro fácil de fazer o que pode validar um aviso, concedido, mas assim é esquecer de adicionar o extra de R $ f = fetch ($ q) no final da enquanto bloco no segundo exemplo que também irá resultar em um loop que nunca terminará. Se eu alterar meu código para remover o aviso e depois se esqueça de adicionar o $ f = fetch ($ q) no final da enquanto bloco Zend não vai aviso é sobre isso!
Assim, removendo o aviso relativo a um erro comum que eu estou me preparando para um erro comum diferente.
Fora da panela, para o fogo.
Solução
while (($row = $sql->db_Fetch("MYSQL_ASSOC")) != false)
Outras dicas
Então você não vai ter que reescrever todo o código sem uma razão decente: Você pode desativar a detecção desse potencial erro de programação no Janela | Preferências, PHP | Análise semântica .
Este é provavelmente marcado como um aviso porque as pessoas costumam usar "=" por engano quando querem dizer "==".
por exemplo:
$a = 1
while($a = 1) {
$a++;
}
Isso nunca vai terminar, mas se você pensou que tinha escrito "==", que deveria.
Zend Studio está tentando ajudá-lo a escrever um código melhor que debugs mais fácil. Desativando a verificação semântica não é uma boa idéia, ele simplesmente varre potenciais problemas para debaixo do tapete e você vai estar perdendo os problemas reais. Essa é uma razão decente! Não evitar mensagens de aviso por ignorá-las, modificar seu código, implementando a solução correta.
Como você bem sabe Zend Studio é construído em eclipse, que é um Java IDE. Na linguagem Java que é ilegal fazer algo parecido com isto:
String s;
while (s = getName()) {
...
}
Isso porque mesmo que retorna 'getName' um valor nulo será atribuído a 's' e lançando entre objetos e booleans (que é do tipo exigido pelas instruções de condição) é um pouco mais subjetivo como com PHP, portanto, irá lançar uma exceção em tempo de compilação.
A situação em PHP pode ser diferente, mas por alguma razão os desenvolvedores Zend decidiu deixar este aviso ativo por padrão, você pode desativá-lo como mencionado antes, mas eu considero que irá ajudá-lo quando uma verdadeira missão na condição acontece.
Limpar o aviso é bastante fácil por apenas atribuir os resultados e, em seguida, comparando-a assim:
if (($result = $mysqli->query ( $query )) == true) {
Em vez de:
if ($result = $mysqli->query ( $query )) {
Como você pode ver você não precisa de cachos de código adicionais.
De qualquer forma, é apenas um aviso, você não precisa se preocupar com eles muito.
Na verdade, eu acho que sua pergunta já foi respondida, um pouco. Mas para resolver o seu problema real, eu acho que isso pode ajudar.
//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);
}
Isso deve fazer o truque eo "Assignment na condição de" -mensagem deve desaparecer.
Como nota: usar o operador igual da mesma maneira como quando você coisas negate. Você também pode usar o sinal de igual com outros operadores como
if ($falseness != false){$trueness = true}
e não
if ($falseness ! false){$trueness = false}
Isso me ajuda a lembrar sempre como comparar valores e não valores atribuir a eles.
A razão que é ruim é um monte de pessoas usam "=" quando o então significava "=="
O operador = retornará o assigment para a esquerda, por isso, se você usa if($x=true)
o código dentro do if será executado, se você usar if($x=false)
o código não será executado. É um truque que pode salvar uma ou duas linhas de código, mas também é perigoso, porque se você quis dizer if($x == false)
e digitou if($x = false)
será um erro que pode ser difícil de rastrear.
Nay meus amigos todas atribuições na condição de gerar este aviso. Eu não quero transformar este fora completamente, como = em vez de == é um erro de sintaxe eu sou propenso a. Quanto à questão de por que é necessário, vou usar um exemplo do Manual do PHP. Esta é a partir da seção sobre o "MySQL melhorado" extensões ou 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"]);
}
Infelizmente, eu desenvolvi minhas funções de banco de dados usando esta técnica e estou tentando usá-los em Zend Studio. Este erro é aparecendo vezes o suficiente para ser uma dor real. Vou reformular com as sugestões aqui, como eu valorizo ??código inequívoca, porém eu também estou indo para pop para o manual PHP e sugerir que mudar o exemplo para usar o melhor estilo. Talvez alguns de vocês poderiam fazer o mesmo e nós poderíamos melhorar a documentação?!