while循环中的对象

Why does the following code work to print an array of mysql rows

    $base=new mysqli("...");        
    $query="SELECT *somthing* FROM *table* WHERE *some match*";
    $result=$base->query($query);
    while ($row=$result->fetch_assoc()) {
        var_dump($row);      
    };

, while this one get's trapped repeatedly printing the first match?

    $base=new mysqli("...");        
    $query="SELECT *somthing* FROM *table* WHERE *some match*";        
    while ($row=$base->query($query)->fetch_assoc()) {
        var_dump($row);          
    };

Because in the second example you're calling the query as well as the result in every iteration of the loop, which means the first result from the query's result set will be returned used in fetch_assoc each time.

Take this for example to illustrate the example:

class Test
{
    public function getQuery()
    {
        echo 'x';
        return $this;
    }

    public function getResult()
    {
        echo 'y';
        return $this;
    }
}

If you loop while ($row = $class->getQuery()->getResult()) { then the echo statements above will output both x and y each time. This highlights the symptom you're seeing where you keep getting the first result each time: xyxyxyxy...

Again - if you run the above class in the form of $query = $class->getQuery() then while ($row = $query->getResult()) { you will see one "x" and plenty of "y"s: xyyyyyyy...