PHP hates globals
authorTim Starling <tstarling@users.mediawiki.org>
Fri, 23 Dec 2005 07:25:44 +0000 (07:25 +0000)
committerTim Starling <tstarling@users.mediawiki.org>
Fri, 23 Dec 2005 07:25:44 +0000 (07:25 +0000)
docs/globals.txt

index 519b416..b36f8ea 100644 (file)
@@ -1,29 +1,77 @@
 globals.txt
 
-PHP loves globals. I hate them. This is not a great
-combination, but I manage. I could get rid of most of
-them by having a single "HTTP request" object, and using
-it to hold everything that's now global (which is exactly
-what I'd do in a Java servlet). But that's really
-awkward in PHP, and wouldn't really provide much benefit
-in readability or maintainability, so I go with the flow
-of PHP and use globals.  Here's documentation on the
-important globals used by the system.
+Globals are evil. The original MediaWiki code relied on
+globals for processing context far too often. MediaWiki
+development since then has been a story of slowly moving
+context out of global variables and into objects. Storing
+processing context in object member variables allows those
+objects to be reused in a much more flexible way. Consider
+the elegance of:
+
+    # Generate the article HTML as if viewed by a web request
+    $article = new Article( Title::newFromText( $t ) );
+    $article->view();
+
+versus
+
+    # Save current globals
+    $oldTitle = $wgTitle;
+    $oldArticle = $wgArticle;
+
+    # Generate the HTML
+    $wgTitle = Title::newFromText( $t );
+    $wgArticle = new Article;
+    $wgArticle->view();
+
+    # Restore globals
+    $wgTitle = $oldTitle
+    $wgArticle = $oldArticle
+
+Some of the current MediaWiki developers have an idle
+fantasy that some day, globals will be eliminated from
+MediaWiki entirely, replaced by an application object which 
+would be passed to constructors. Whether that would be an 
+efficient, convenient solution remains to be seen, but 
+certainly PHP 5 makes such object-oriented programming 
+models easier than they were in previous versions.
+
+For the time being though, MediaWiki programmers will have
+to work in an environment with some global context. At the 
+time of writing, 418 globals were initialised on startup by 
+MediaWiki. 304 of these were configuration settings, which 
+are documented in DefaultSettings.php. There is no 
+comprehensive documentation for the remaining 114 globals, 
+however some of the most important ones are listed below. 
+They are typically initialised either in index.php or in 
+Setup.php.
+
 
 $wgOut
        OutputPage object for HTTP response.
 
+$wgUser
+       User object for the user associated with the current
+       request.
+
 $wgTitle
        Title object created from the request URL.
 
 $wgLang
-       Language object for this request.
+       Language object selected by user preferences
+
+$wgContLang
+       Language object associated with the wiki being
+       viewed.
 
 $wgArticle
-       Article object corresponsing to $wgTitle.
+       Article object corresponding to $wgTitle.
 
 $wgLinkCache
        LinkCache object.
 
-...
+$wgParser
+       Parser object. Parser extensions register their
+       hooks here.
 
+$wgLoadBalancer
+       A LoadBalancer object, manages database connections.