2012-01-19 13 views
-1

私はこのスクリプトループを5回作成することはできません。また、recursion()メソッドをループして停止することはできません。 $ xの値は常に1で、2番目のwhileは決して到達しません。誰でも私にこのことを理解する助けを与えることができますか?メソッド内のPHPループ

ありがとうございます!

public function recursion(){  

    $a = 0;   

    do{ 
     $a++;  

     echo "$a \n"; 
     sleep(1); 
     echo date('h:i:s') . "\n"; 
    }while($a < 5); 

    $x++; 
    echo "** $x **\n"; 

    while($x <= 5){ 
     echo "Going back to my method $x times \n"; 
     $this->recursion(); // I'd like to loop this method X times 
     } 
} 

答えて

1

あなたは再帰間$xを渡していないので、あなたがそれをインクリメントしようとすると、$xは未定義です。

機能の冒頭にstatic $x = 0;を追加します。

0

あなたは$xの状態を保持しません。それをクラスのメンバーにして$this->xで参照することができます。

+0

おい、みんなありがとう!それは本当に私がこの問題をより良く理解する助けになりました。 – rpa

0

$ xを再帰的に利用できると仮定するのではなく、クラス変数などを割り当てないのはなぜですか?

private $x; 
public function recursion(){  

     $a = 0;   

     do{ 
      $a++;  

      echo "$a \n"; 
      sleep(1); 
      echo date('h:i:s') . "\n"; 
     }while($a < 5); 

     $this->x ++; 
     echo "** $this->x **\n"; 

     while($this->x <= 5){ 
      echo "Going back to my method $this->x times \n"; 
      $this->recursion(); // I'd like to loop this method X times 
      } 
    } 
0

宣言した変数($ x)は、recursionメソッドの各インスタンスに対してプライベートです。したがって、あなたがそれらに行った変更は、次の呼び出しに引き継がれません。
私はあなたがオブジェクトの内部にいると仮定しているので、これらの変数をオブジェクトのメンバーにして、そのスコープをメソッドからオブジェクトに変更します。 recursionに対するすべての呼び出しは、同じ対象範囲内にあるので、値が引き継がれます

private $x=0; 
public function recursion(){  

     $a = 0;   

     do{ 
      $a++;  

      echo "$a \n"; 
      sleep(1); 
      echo date('h:i:s') . "\n"; 
     }while($a < 5); 

     $this->x++; 
     echo "** {$this->x} **\n"; 

     while($this->x <= 5){ 
      echo "Going back to my method {$this->x} times \n"; 
      $this->recursion(); // I'd like to loop this method X times 
      } 
    } 
0

方法で$xがローカル変数です。 recursion()に電話するたびに、$xは完全に新しいものになります。したがって、$x++の後には、値は1になります。

private $x = 0; 
public function recursion(){  

    $a = 0;   

    do{ 
     $a++;  

     echo "$a \n"; 
     sleep(1); 
     echo date('h:i:s') . "\n"; 
    }while($a < 5); 

    $this->x++; 
    echo "** {$this->x} **\n"; 

    while($this->x <= 5){ 
     echo "Going back to my method $this->x times \n"; 
     $this->recursion(); // I'd like to loop this method X times 
    } 
} 

ところで、テール再帰ですので、それは常にループに還元することができます。何かのように:

public function loop(){  
    for($x = 1; $x <= 5; $x++){ 
     echo "** {$x} **\n"; 

     $a = 0;   

     do{ 
      $a++;  

      echo "$a \n"; 
      sleep(1); 
      echo date('h:i:s') . "\n"; 
     }while($a < 5); 
    } 
} 

とにかく、あなた自身の理由がある場合。先に行く。

+0

興味深い選択肢。私はそれを私の問題に適応させようとします。ありがとう – rpa

関連する問題