PDO::query ritorna una risorsa (il risultato della query) wrappato nel PDOStatement. PDOStatement fornisce un api per accedere a tale risorsa in vari modi. Quindi no non è un array, viene elaborato come tale se lo chiedi a PDOStatement. Se poi internamente venga gestito in un modo piuttosto che un altro, poco ti dovrebbe interessare (e poco interessa a me diciamo va).

Se poi leggi qui: http://stackoverflow.com/questions/1...each-and-fetch la risposta spiega molto meglio di me il concetto