2

ファンキーなタイトルで申し訳ありません。タイトルを思い付くのに苦労しました。まず、コードを分解した後、問題を実際に解決することができましたが、なぜ解決策が機能したのかわかりません。これを学習体験として扱おうとしています。

データベースから情報を収集するクラスがあります。このクラスはインデックス値を追跡して、呼び出し元の関数が一度に 1 つずつ結果を取得できるようにします。したがって、私のクラスコードにはもともと含まれていました...

protected $index = NULL;
protected $array = array(stuff);

public function next_item()
{
    if($this->index == NULL)
    {//first time called
        $this->index = 0;
    }
    else
    {
        $this->index++;
    }

    if($this->index < sizeof($this->array))
    {
          return TRUE;
     }
      return FALSE;
 }

 public function get_result()
 {
      return $this->array[$this->index];
  }

そして、呼び出し関数には次のようなものがあります

 while($myclass->next_item()){
        echo $myclass->get_result();
 }

もちろん、これはこれよりもはるかに複雑ですが、これが問題のコードです (そして、あなたはアイデアを得るでしょう)。このコードは、私のプロジェクトで無限ループ (またはループの出現) を引き起こしました。$index を -1 に初期化し、null の条件付きチェックを削除することで問題を解決しました。だから今...

protected $index = -1;

public function next_item()
{
    $this->index++;

    if($this->index < sizeof($this->array))
    {
          return TRUE;
    }
    return FALSE;
}

私の質問は、なぜそれが機能したのですか? インデックスがNULLである間、配列で参照されることはありませんでした。確認しました。常に NULL の条件チェックが呼び出され、0 への代入が発生した後でした。

どうぞよろしくお願いいたします。これを学習体験に変えようとしているだけで、それが機能しただけでなく、なぜ機能したかを理解した方がよい.

この質問が別の場所で回答されている場合は申し訳ありませんが、質問にラベルを付ける方法がわかりませんでした (ご覧のとおり)。

乾杯 -デビッド

4

1 に答える 1

3

あなたの問題は0 == NULL、PHP. したがって、インデックスを一度に設定すると、を呼び出すたびに何度も何度も0設定し続けることになり、常に true になります。0next_itemthis->index == NULL

テストを に変更するthis->index === NULLと、問題も解決します。PHPのとの違いをカバーするこの質問を参照してください。=====

于 2012-06-15T03:30:34.130 に答える