[TASK] Deprecate $ref param types of method callUserFunction 75/63075/8
authorAlexander Schnitzler <git@alexanderschnitzler.de>
Thu, 30 Jan 2020 12:45:01 +0000 (13:45 +0100)
committerSusanne Moog <look@susi.dev>
Thu, 27 Feb 2020 13:03:32 +0000 (14:03 +0100)
Passing a non object variable or non null value as third argument
"$ref" into method GeneralUtility::callUserFunction has been
deprecated.

As of TYPO3 version 11.0 said method argument must be either null
or of type object.

Releases: master
Resolves: #90377
Change-Id: I83d75c1c78d1d41d94b6e497b04644e704b902db
Reviewed-on: https://review.typo3.org/c/Packages/TYPO3.CMS/+/63075
Tested-by: TYPO3com <noreply@typo3.com>
Tested-by: Benni Mack <benni@typo3.org>
Tested-by: Susanne Moog <look@susi.dev>
Reviewed-by: Benni Mack <benni@typo3.org>
Reviewed-by: Susanne Moog <look@susi.dev>
typo3/sysext/core/Classes/Utility/GeneralUtility.php
typo3/sysext/core/Documentation/Changelog/master/Deprecation-90377-DeprecateRefParamTypesOfMethodCallUserFunction.rst [new file with mode: 0644]
typo3/sysext/frontend/Classes/Http/RequestHandler.php

index f4a5e78..ce845aa 100644 (file)
@@ -3334,8 +3334,15 @@ class GeneralUtility
      * @return mixed Content from method/function call
      * @throws \InvalidArgumentException
      */
-    public static function callUserFunction($funcName, &$params, &$ref)
+    public static function callUserFunction($funcName, &$params, &$ref = null)
     {
+        if (!($ref === null || is_object($ref))) {
+            trigger_error(
+                sprintf('Argument "$ref" is of type "%s" which is deprecated since TYPO3 10.3. "$ref" must be of type "object" or null as of version 11.0', gettype($ref)),
+                E_USER_DEPRECATED
+            );
+        }
+
         // Check if we're using a closure and invoke it directly.
         if (is_object($funcName) && is_a($funcName, \Closure::class)) {
             return call_user_func_array($funcName, [&$params, &$ref]);
diff --git a/typo3/sysext/core/Documentation/Changelog/master/Deprecation-90377-DeprecateRefParamTypesOfMethodCallUserFunction.rst b/typo3/sysext/core/Documentation/Changelog/master/Deprecation-90377-DeprecateRefParamTypesOfMethodCallUserFunction.rst
new file mode 100644 (file)
index 0000000..b7b7e00
--- /dev/null
@@ -0,0 +1,32 @@
+.. include:: ../../Includes.txt
+
+===========================================================================
+Deprecation: #90377 - Deprecate $ref param types of method callUserFunction
+===========================================================================
+
+See :issue:`90377`
+
+Description
+===========
+
+:php:`GeneralUtility::callUserFunction()` accepts a reference variable which is used to pass on the caller to the called function. Said variable :php:`$ref` does not have a type hint, therefore it's possible to pass into any type of variable whilst it's purpose is to only accept objects.
+
+
+Impact
+======
+
+Passing :php:`$ref` into :php:`GeneralUtility::callUserFunction()` with a type other than :php:`object` or :php:`null` triggers a deprecation warning.
+
+
+Affected Installations
+======================
+
+All installations that pass a non :php:`object` or non :php:`null` type :php:`$ref` variable into :php:`GeneralUtility::callUserFunction()`.
+
+
+Migration
+=========
+
+There is none. :php:`$ref` is meant to be the calling object. Using it to pass arbitrary data to the user function will eventually be forbidden.
+
+.. index:: PHP-API, NotScanned, ext:core
index 0df74fa..783d62f 100644 (file)
@@ -698,7 +698,7 @@ class RequestHandler implements RequestHandlerInterface
 
         // @internal hook for EXT:seo, will be gone soon, do not use it in your own extensions
         $_params = ['page' => $controller->page];
-        $_ref = '';
+        $_ref = null;
         foreach ($GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['TYPO3\CMS\Frontend\Page\PageGenerator']['generateMetaTags'] ?? [] as $_funcRef) {
             GeneralUtility::callUserFunction($_funcRef, $_params, $_ref);
         }