So ....
There are obviously many questions that all have been asked about Singletons, Global State Variables, and all that great stuff. My question is,
Because it's relatively easy to work with singletons, and working without takes much more detailed planning of your application's structure. I asked a question about alternatives some time ago, and got interesting answers.
Reasons in PHP4-based apps like WP or CI are partially due to PHP4's worse support of OOP constructs.
Globals and singletons are also simple: It requires much less thinking to slap something in a global than building it with proper OOP practices. It's simpler to access them too, just point the code at the name and that's it instead of needing to pass the object in from somewhere else.
One negative side effect of global state (global variables, singletons, etc.) is that it makes things much more difficult to unit test.
ps: In my experience wordpress in general has a pretty poor quality of code. I would not use it as a metric of anything...
In the process of cleaning a Singleton would represent hiding the dirt in the dark corner instead of cleaning.
It's so widely used because it does it's job of hiding problems very well.
It's a good thing for those who are to clean, but don't want to.
It's a bad thing for those who are up to actually clean something.
Consider Dependency Injection http://martinfowler.com/articles/injection.html if a Singleton is causing a problem you can't hide anymore.
Probably because of the Design Patterns book by the GoF. It's become too pervasive and people treat it as infallible.
People discourage the use of global variables because it increases the likeliness of bugs. It's so much easier to make a mistake somewhere if every function in your program accesses the same global variables, and it's much harder to debug. It's also much harder to test for.
I imagine they're still used so often because programmers are lazy. We don't want to spend time up-front making the code all organized and pretty, we just want to get the job done. It's so much easier to just write a global function/variable/whatever than to modularize it, and once you've started down that path it's too much of a pain to go back and refactor. Maybe that's the reason: They started out that way and simply never turned back.
If Singletons and Globals are So Bad, Why are they used so often?
I think the gist of it is that Singletons make things easy. At least at first sight. I don't have enough experience with the matter to say anything more useful, however I found the following a good read:
Singleton Considered Stupid (Steve Yegge)