summaryrefslogtreecommitdiff
path: root/includes/StubObject.php
diff options
context:
space:
mode:
authorPierre Schmitz <pierre@archlinux.de>2006-10-11 20:21:25 +0000
committerPierre Schmitz <pierre@archlinux.de>2006-10-11 20:21:25 +0000
commitd81f562b712f2387fa02290bf2ca86392ab356f2 (patch)
treed666cdefbe6ac320827a2c6cb473581b46e22c4c /includes/StubObject.php
parent183851b06bd6c52f3cae5375f433da720d410447 (diff)
Aktualisierung auf Version 1.8.1
Diffstat (limited to 'includes/StubObject.php')
-rw-r--r--includes/StubObject.php130
1 files changed, 130 insertions, 0 deletions
diff --git a/includes/StubObject.php b/includes/StubObject.php
new file mode 100644
index 00000000..ed3b117a
--- /dev/null
+++ b/includes/StubObject.php
@@ -0,0 +1,130 @@
+<?php
+
+/**
+ * Class to implement stub globals, which are globals that delay loading the
+ * their associated module code by deferring initialisation until the first
+ * method call.
+ *
+ * Note on unstub loops:
+ *
+ * Unstub loops (infinite recursion) sometimes occur when a constructor calls
+ * another function, and the other function calls some method of the stub. The
+ * best way to avoid this is to make constructors as lightweight as possible,
+ * deferring any initialisation which depends on other modules. As a last
+ * resort, you can use StubObject::isRealObject() to break the loop, but as a
+ * general rule, the stub object mechanism should be transparent, and code
+ * which refers to it should be kept to a minimum.
+ */
+class StubObject {
+ var $mGlobal, $mClass, $mParams;
+ function __construct( $global = null, $class = null, $params = array() ) {
+ $this->mGlobal = $global;
+ $this->mClass = $class;
+ $this->mParams = $params;
+ }
+
+ static function isRealObject( $obj ) {
+ return is_object( $obj ) && !is_a( $obj, 'StubObject' );
+ }
+
+ function _call( $name, $args ) {
+ $this->_unstub( $name, 5 );
+ return call_user_func_array( array( $GLOBALS[$this->mGlobal], $name ), $args );
+ }
+
+ function _newObject() {
+ return wfCreateObject( $this->mClass, $this->mParams );
+ }
+
+ function __call( $name, $args ) {
+ return $this->_call( $name, $args );
+ }
+
+ /**
+ * This is public, for the convenience of external callers wishing to access
+ * properties, e.g. eval.php
+ */
+ function _unstub( $name = '_unstub', $level = 2 ) {
+ static $recursionLevel = 0;
+ if ( get_class( $GLOBALS[$this->mGlobal] ) != $this->mClass ) {
+ $fname = __METHOD__.'-'.$this->mGlobal;
+ wfProfileIn( $fname );
+ $caller = wfGetCaller( $level );
+ if ( ++$recursionLevel > 2 ) {
+ throw new MWException( "Unstub loop detected on call of \${$this->mGlobal}->$name from $caller\n" );
+ }
+ wfDebug( "Unstubbing \${$this->mGlobal} on call of \${$this->mGlobal}->$name from $caller\n" );
+ $GLOBALS[$this->mGlobal] = $this->_newObject();
+ --$recursionLevel;
+ wfProfileOut( $fname );
+ }
+ }
+}
+
+class StubContLang extends StubObject {
+ function __construct() {
+ parent::__construct( 'wgContLang' );
+ }
+
+ function __call( $name, $args ) {
+ return StubObject::_call( $name, $args );
+ }
+
+ function _newObject() {
+ global $wgContLanguageCode;
+ $obj = Language::factory( $wgContLanguageCode );
+ $obj->initEncoding();
+ $obj->initContLang();
+ return $obj;
+ }
+}
+class StubUserLang extends StubObject {
+ function __construct() {
+ parent::__construct( 'wgLang' );
+ }
+
+ function __call( $name, $args ) {
+ return $this->_call( $name, $args );
+ }
+
+ function _newObject() {
+ global $wgContLanguageCode, $wgRequest, $wgUser, $wgContLang;
+ $code = $wgRequest->getVal('uselang', '');
+ if ($code == '')
+ $code = $wgUser->getOption('language');
+ # Validate $code
+ if( empty( $code ) || !preg_match( '/^[a-z]+(-[a-z]+)?$/', $code ) ) {
+ $code = $wgContLanguageCode;
+ }
+
+ if( $code == $wgContLanguageCode ) {
+ return $wgContLang;
+ } else {
+ $obj = Language::factory( $code );
+ return $obj;
+ }
+ }
+}
+class StubUser extends StubObject {
+ function __construct() {
+ parent::__construct( 'wgUser' );
+ }
+
+ function __call( $name, $args ) {
+ return $this->_call( $name, $args );
+ }
+
+ function _newObject() {
+ global $wgCommandLineMode;
+ if( $wgCommandLineMode ) {
+ $user = new User;
+ $user->setLoaded( true );
+ } else {
+ $user = User::loadFromSession();
+ wfRunHooks('AutoAuthenticate',array($user));
+ }
+ return $user;
+ }
+}
+
+?>