1: Since you have to use session variables your questin reduces to "where should I use sessions variables", I think. I'm a bit of a fan of the load once access from everywhere method.
2: Rather than pass, you are allowed to have a module called Session::Parameters, or something silly like that. Call the session loader when the script starts and then all modules can access that module's namespace. Whenever you think global variables might be useful, pop them in a module instead. Then all modules access Parameters::UserInfo or whatever you called it.
3: Yes.
4: Not bad, but cumbersome. Global variables are not always wrong, just almost always wrong. All comments about side effects from routines apply here.
____________________
Jeremy
I didn't believe in evil until I dated it.