diff options
author | Pierre Schmitz <pierre@archlinux.de> | 2006-10-11 20:21:25 +0000 |
---|---|---|
committer | Pierre Schmitz <pierre@archlinux.de> | 2006-10-11 20:21:25 +0000 |
commit | d81f562b712f2387fa02290bf2ca86392ab356f2 (patch) | |
tree | d666cdefbe6ac320827a2c6cb473581b46e22c4c /includes/StubObject.php | |
parent | 183851b06bd6c52f3cae5375f433da720d410447 (diff) |
Aktualisierung auf Version 1.8.1
Diffstat (limited to 'includes/StubObject.php')
-rw-r--r-- | includes/StubObject.php | 130 |
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; + } +} + +?> |