X-Git-Url: http://git.cyclocoop.org/?a=blobdiff_plain;f=includes%2FStubObject.php;h=bb173e7c714f05d67e3b625bb6399b74c2a3fe81;hb=f0d1e12ffa186654a2f262c2ac87944feec81eb5;hp=5b26d45fb13e3200272b23e23f394aa170ea982d;hpb=8cf851fbe5a3cb3d26f27175f490b41d2b7387b6;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/StubObject.php b/includes/StubObject.php index 5b26d45fb1..bb173e7c71 100644 --- a/includes/StubObject.php +++ b/includes/StubObject.php @@ -25,6 +25,12 @@ * their associated module code by deferring initialisation until the first * method call. * + * Note on reference parameters: + * + * If the called method takes any parameters by reference, the __call magic + * here won't work correctly. The solution is to unstub the object before + * calling the method. + * * Note on unstub loops: * * Unstub loops (infinite recursion) sometimes occur when a constructor calls @@ -41,10 +47,9 @@ class StubObject { /** * Constructor. * - * @param string $global name of the global variable. - * @param string $class name of the class of the real object. - * @param array $params parameters to pass to constructor of the real - * object. + * @param string $global Name of the global variable. + * @param string $class Name of the class of the real object. + * @param array $params Parameters to pass to constructor of the real object. */ function __construct( $global = null, $class = null, $params = array() ) { $this->mGlobal = $global; @@ -56,11 +61,25 @@ class StubObject { * Returns a bool value whenever $obj is a stub object. Can be used to break * a infinite loop when unstubbing an object. * - * @param $obj Object to check. - * @return Boolean: true if $obj is not an instance of StubObject class. + * @param object $obj Object to check. + * @return bool True if $obj is not an instance of StubObject class. */ static function isRealObject( $obj ) { - return is_object( $obj ) && !($obj instanceof StubObject); + return is_object( $obj ) && !$obj instanceof StubObject; + } + + /** + * Unstubs an object, if it is a stub object. Can be used to break a + * infinite loop when unstubbing an object or to avoid reference parameter + * breakage. + * + * @param object $obj Object to check. + * @return void + */ + static function unstub( $obj ) { + if ( $obj instanceof StubObject ) { + $obj->_unstub( 'unstub', 3 ); + } } /** @@ -70,8 +89,8 @@ class StubObject { * This function will also call the function with the same name in the real * object. * - * @param string $name name of the function called - * @param array $args arguments + * @param string $name Name of the function called + * @param array $args Arguments * @return mixed */ function _call( $name, $args ) { @@ -91,8 +110,8 @@ class StubObject { * Function called by PHP if no function with that name exists in this * object. * - * @param string $name name of the function called - * @param array $args arguments + * @param string $name Name of the function called + * @param array $args Arguments * @return mixed */ function __call( $name, $args ) { @@ -105,15 +124,15 @@ class StubObject { * This is public, for the convenience of external callers wishing to access * properties, e.g. eval.php * - * @param string $name name of the method called in this object. - * @param $level Integer: level to go in the stack trace to get the function - * who called this function. + * @param string $name Name of the method called in this object. + * @param int $level Level to go in the stack trace to get the function + * who called this function. * @throws MWException */ function _unstub( $name = '_unstub', $level = 2 ) { static $recursionLevel = 0; - if ( !($GLOBALS[$this->mGlobal] instanceof StubObject) ) { + if ( !$GLOBALS[$this->mGlobal] instanceof StubObject ) { return $GLOBALS[$this->mGlobal]; // already unstubbed. }