Cita: Entonces como hago sin el array_merge?
Si pongo $_SESSION['formulario'] = $_POST; se borrarían los valores anteriores...
Tienes razón .. Ok.
Cita: Por lo de que if(!isset($_SESSION)) session_start();
no siempre se ejecutará y además te deja incluir el archivo con include() (si pones session_start dos veces, al final yo tuve el problema de que mi session_id() estaba vacío o.O) y te olvidas de que en el php.ini se puede configurar una directiva (session.auto_start, creo) en on para que no sea necesario iniciar las sesiones
No entendí bien tu argumento .. Por mi parte sólo cometo que es necesario un session_start() (y no más) al principio de tu script .. o mejor dicho antes de pretender ver el valor del array superglobal: $_SESSION.
Te propongo un ejemplo de posible falla de seguridad .. imagina situación: register_globals a ON ...
tu_script.php?_SESSION=valor
Ya pasaría por tu validación como "que existe" (isset()) pues aprovechando de que "register_globals a ON" no hace discriminación con la variable o método por el que llega .. la introducí por el URL, esto sumado a que session_start() estaría -despues- de esa validación .. podría ser una combinación no muy segura.
El uso de "session.auto_start" afectaría a todo el servidor y aplicación que en el corra. Creo que es más sano usar el inico de sesiones (session_start() en el momento que se necesite .. no por defecto en todo script PHP que ese servidor ejecute).
Un saludo,