Page Menu
Home
Phabricator
Search
Configure Global Search
Log In
Files
F3503
StubObject.php
Public
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Authored By
•
bzimport
Nov 21 2014, 9:31 PM
2014-11-21 21:31:00 (UTC+0)
Size
3 KB
Referenced Files
None
Subscribers
None
StubObject.php
View Options
<?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
)
&&
!(
$obj
instanceof
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'
,
$wgUser
->
getOption
(
'language'
)
);
// if variant is explicitely selected, use it instead the one from wgUser
// see bug #7605
if
(
$wgContLang
->
hasVariants
()){
$variant
=
$wgContLang
->
getPreferredVariant
();
if
(
$variant
!=
$wgContLanguageCode
)
$code
=
$variant
;
}
# 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
;
}
else
{
$user
=
User
::
newFromSession
();
wfRunHooks
(
'AutoAuthenticate'
,
array
(&
$user
));
}
return
$user
;
}
}
?>
File Metadata
Details
Attached
Mime Type
text/x-php
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
3070
Default Alt Text
StubObject.php (3 KB)
Attached To
Mode
T10944: The deprecated is_a() function is used in StubObjects.php
Attached
Detach File
Event Timeline
Log In to Comment