Globals are perfect for this task, and WordPress itself uses them all the time. Not sure why you are saying that, mr. Esmi. Transients seem like a rather WordPress-specific way of storing (cached) data, not at all what this question asker wants.
You can, for instance, also define globals in your functions.php.
A global in PHP is nothing other than a variable that has been defined in the default scope and which can be accessed in other PHP files as well as in functions and classes and the like, by simply stating a globals declaration for that variable.
global $myvariable;
That is all there is to it. It has nothing to do with WordPress proper.
Here are some globals you cannot use:
global $posts, $post, $wp_did_header, $wp_query, $wp_rewrite, $wpdb, $wp_version, $wp, $id, $comment, $user_ID;
Note that template files are included in a way that makes variables declared in e.g. header.php not accessible in index.php, but they are the other way around (define in index.php, do a global declare in header.php).
If you use the $GLOBALS[‘name’] like Simalam suggests, it should always work. WordPress has (or really should) have no way whatsoever to disrupt any globals you use or declare other than when you use or define a variable that WordPress already uses itself.
There are some more globals you cannot use, like $page, $numpages, $more, that can result from the query being set up. But if things start to act weird, you know what’s up.
To find all the currently defined symbols in the global scope, do:
print_r(array_keys($GLOBALS));
Just because they are defined doesn’t mean WordPress necessarily uses them, they may simply not have been unset after they were no longer required.
Just use common sense and all will work out fine..
The only time something fishy started happening to me is not because I used a global, but because I had aliased a symbol to something that already existed (like $a =& $GLOBALS[‘wp’]) and then re-used that symbol (variable name) while it was still bound to that other variable :P.