цикл php в методе - PullRequest
       2

цикл php в методе

0 голосов
/ 19 января 2012

Я не могу сделать этот цикл скрипта 5 раз и остановиться после цикла через метод recursion (). Значение для $ x всегда равно 1, а 2-е время никогда не достигается. Может ли кто-нибудь помочь мне понять это, пожалуйста?

Заранее спасибо!

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
        }
}

Ответы [ 5 ]

1 голос
/ 19 января 2012

Поскольку вы не передаете $x между рекурсиями, $x не определено, когда вы пытаетесь увеличить его.

Добавьте static $x = 0; в начале вашей функции.

0 голосов
/ 19 января 2012

$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 голосов
/ 19 января 2012

Объявленная вами переменная ($ 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 голосов
/ 19 января 2012

Почему бы вам не назначить переменные класса или что-то еще, чтобы отслеживать $ x, вместо того, чтобы предполагать, что он останется доступным в течение рекурсии?

0 голосов
/ 19 января 2012

Вы не сохраняете состояние $x.Вы можете сделать его членом класса и ссылаться на него с помощью $this->x.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...