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は$ aに割り当てられ、$ aに対してテストされ、$ aが1でないときにwhileステートメントにfalseを返すのではなく、whileステートメントに1を返すため、終了しません
警告を検証する可能性のある簡単なエラーは認められますが、2番目の例のwhileブロックの最後に余分な$ f = fetch($ q)を追加することを忘れてしまいます。決して終了しません。警告を削除するようにコードを変更し、whileブロックの最後に$ f = fetch($ q)を追加するのを忘れると、Zendはそのことを警告しません!
したがって、一般的なエラーに関する警告を削除することで、別の一般的なエラーに対応するように設定しています。
鍋から火の中へ。
解決
while (($row = $sql->db_Fetch("MYSQL_ASSOC")) != false)
他のヒント
したがって、正当な理由なしにすべてのコードを書き換える必要はありません。 この潜在的なプログラミングエラーの検出は、[ウィンドウ|環境設定、PHP |セマンティック分析。
人々はしばしば" ="を使用するため、これはおそらく警告としてマークされています。誤って" =="を意味する場合。
eg:
$a = 1
while($a = 1) {
$a++;
}
これは終了することはありませんが、「" =="」と書いたと思った場合は終了するはずです。
Zend Studioは、デバッグを容易にする優れたコードの作成を支援しようとしています。セマンティックチェックを無効にすることはお勧めできません。カーペットの下にある潜在的な問題を一掃するだけで、実際の問題を見逃してしまいます。それはまともな理由です!警告メッセージを無視して警告メッセージを避けないでください。正しいソリューションを実装してコードを変更してください。
ご存じのとおり、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 )) {
ご覧のとおり、追加のコードの束は必要ありません。
とにかくそれは単なる警告であり、あまり心配する必要はありません。
実際、あなたの質問はすでにある程度答えられていると思います。しかし、実際の問題に対処するには、これが役立つと思います。
//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($ xを使用すると、if内のコードが実行されます= false)
コードは実行されません。これは1行または2行のコードを保存できる巧妙なトリックですが、 if($ x == false)
を意味して if($ x = false)
それは追跡が困難なバグになるでしょう。
いや、友人が条件に all 割り当てをすると、この警告が生成されます。 ==の代わりに=は構文エラーなので、これを完全にオフにしたくありません。 なぜ必要なのかという質問については、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マニュアルにも目を通し、より良いスタイルを使用するように例を変更することを提案します。おそらくあなたの何人かは同じことをすることができ、ドキュメントを改善することができますか?!