To tutaj nie masz iteratorów tylko ArrayAccess właściwie. IMHO twój przykład jest technicznie fajny, ale mało zrozumiały - przegięcie z bajerami. Ja bym wolał:
<?php
$news = $newsList->findById(1);
$news->title = 'foo';
// ... lub ...
$news->setTitle('foo');
$newsList->delete(1);
?>
$news['title'] jest możliwe ale bardzo zakręcone i tak naprawdę nic nie daje poza dezorientacją. $news->title jest już znacznie lepsze, jeżeli nie chcemy pisać metody setXXX() dla każdego atrybutu. Gorzej, jeżeli ustawienie tego atrybutu wymaga jakiś nietrywialnych operacji - wtedy w metodzie __set() musiałbyś mieć paskudnego switcha.
Natomiast usuwanie realizowane za pomocę destruktorów jest bardzo ciekawe, ale trochę bym się obawiał. Powody:
1) Destruktory będą wywoływane same z siebie na końcu skryptu.
2) Zawsze można utworzyć obiekt $news ręcznie (czyli bez odpowiednika w bazie danych), i co wtedy zrobi destruktor?
3) Jeżeli wystąpi jakiś problem przy zapytaniu DELETE, to jak poinformować użytkownika? Destruktor rzucający wyjątek?
Chociaż, jeżeli uda się ominąć trudności techniczne, jest to bardzo ciekawy pomysł. Rozwiązuje problem istnienia obiektu $news po usunięciu newsa - łączy usunięcie obiektu z usunięciem rekordu z bazy danych, a to jest duża zaleta.