Merge "Add 'since <version>' to @deprecated annotations"
[lhc/web/wiklou.git] / includes / StubObject.php
index 59238fa..bb173e7 100644 (file)
  * 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,13 +61,27 @@ 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;
        }
 
+       /**
+        * 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 );
+               }
+       }
+
        /**
         * Function called if any function exists with that name in this object.
         * It is used to unstub the object. Only used internally, PHP will call
@@ -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,9 +124,9 @@ 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 ) {