9

最近、次のタイプのコードを警告していると報告されている 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++;
}

$a に対してテストされ、$a が 1 でない場合に while ステートメントに false を返すのではなく、$a に 1 が代入され、while ステートメントに 1 が返されるため、決して終了しません。

警告を検証する可能性のある簡単なエラーは認められますが、2番目の例のwhileブロックの最後に余分な $f = fetch($q) を追加するのを忘れているため、決して終了しないループが発生します. コードを変更して警告を削除し、while ブロックの最後に $f = fetch($q) を追加するのを忘れた場合、Zend はそれについて警告しません!

したがって、一般的なエラーに関する警告を削除することで、別の一般的なエラーに備えることができます。

鍋から火の中へ。

4

8 に答える 8

30
while (($row = $sql->db_Fetch("MYSQL_ASSOC")) != false)
于 2010-04-05T04:53:05.417 に答える
8

したがって、適切な理由なしにすべてのコードを書き直す必要はありません。この潜在的なプログラミング エラーの検出は、Window | 環境設定、PHP | セマンティック分析

于 2010-12-10T09:49:26.473 に答える
2

Zend Studio は、より簡単にデバッグできる優れたコードを作成できるように支援しようとしています。セマンティック チェックを無効にすることは良い考えではありません。潜在的な問題をカーペットの下に一掃するだけで、実際の問題を見逃すことになります。それはまともな理由です!警告メッセージを無視して回避しないでください。正しい解決策を実装してコードを変更してください。

于 2011-02-24T12:59:02.617 に答える
2

よく知られているように、Zend Studio は Java IDE である Eclipse 上に構築されています。Java 言語では、次のようなことは違法です。

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

これは、'getName' が null 値を返した場合でも、それは 's' に割り当てられ、オブジェクトとブール値 (条件ステートメントで必要な型) の間のキャストは、PHP のようにもう少し主観的であるためです。コンパイル時の例外。

PHP の状況は異なる場合がありますが、何らかの理由で Zend の開発者はこの警告をデフォルトでアクティブのままにしておくことにしました。前述のように無効にすることもできますが、状態で実際の割り当てが発生したときに役立つと思います。

結果を割り当ててから、次のように比較するだけで、警告をきれいにするのは非常に簡単です。

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

それ以外の:

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

ご覧のとおり、追加のコードの束は必要ありません。

いずれにせよ、これは単なる警告です。あまり気にする必要はありません。

于 2011-08-11T23:57:38.643 に答える
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);
}

これで問題は解決し、「Assignment in condition」メッセージが消えるはずです。

補足として、否定するときと同じように equals 演算子を使用してください。次のような他の演算子でも等号を使用します

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

そしてそうではない

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

これにより、値を比較する方法と値を割り当てる方法を常に覚えておくことができます。

于 2010-09-28T08:59:05.537 に答える
0

それが悪い理由は、多くの人が「==」を意味するときに「=」を使用するためです

= 演算子は割り当てを左側に返すため、ifif($x=true)内でコードを使用すると実行され、if($x=false)コードを使用すると実行されません。これは 1 ~ 2 行のコードを節約できる巧妙なトリックですが、意図if($x == false)して入力した場合if($x = false)、追跡が困難なバグになる可能性があるため、危険でもあります。

于 2009-03-10T13:13:39.733 に答える
0

条件内のすべての割り当てでこの警告が生成されます。== の代わりに = は私が起こしやすい構文エラーであるため、これを完全にオフにしたくありません。なぜそれが必要なのかという質問については、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 マニュアルにも立ち寄り、より良いスタイルを使用するように例を変更することを提案します。おそらく、あなたの何人かが同じことをして、ドキュメントを改善できるでしょうか?!

于 2010-09-30T18:36:28.670 に答える