Sometimes the closure are hidden in arrays, catch this.
The $maxDepth check is just for sanity, I don't think it's
actually needed.
Follows-Up:
c2c7452577e
Bug: T111641
Change-Id: Id5e036ce4949b8106873fd938f54c2774d3d6a4a
use MediaWiki\Logger\LegacySpi;
use MediaWiki\Logger\LoggerFactory;
use MediaWiki\Logger\MonologSpi;
use MediaWiki\Logger\LegacySpi;
use MediaWiki\Logger\LoggerFactory;
use MediaWiki\Logger\MonologSpi;
$GLOBALS[$globalKey] instanceof FauxRequest
) {
$this->mwGlobals[$globalKey] = clone $GLOBALS[$globalKey];
$GLOBALS[$globalKey] instanceof FauxRequest
) {
$this->mwGlobals[$globalKey] = clone $GLOBALS[$globalKey];
- } elseif ( $GLOBALS[$globalKey] instanceof Closure ) {
+ } elseif ( $this->containsClosure( $GLOBALS[$globalKey] ) ) {
// Serializing Closure only gives a warning on HHVM while
// it throws an Exception on Zend.
// Workaround for https://github.com/facebook/hhvm/issues/6206
// Serializing Closure only gives a warning on HHVM while
// it throws an Exception on Zend.
// Workaround for https://github.com/facebook/hhvm/issues/6206
+ /**
+ * @param mixed $var
+ * @param int $maxDepth
+ *
+ * @return bool
+ */
+ private function containsClosure( $var, $maxDepth = 15 ) {
+ if ( $var instanceof Closure ) {
+ return true;
+ }
+ if ( !is_array( $var ) || $maxDepth === 0 ) {
+ return false;
+ }
+
+ foreach ( $var as $value ) {
+ if ( $this->containsClosure( $value, $maxDepth - 1 ) ) {
+ return true;
+ }
+ }
+ return false;
+ }
+
/**
* Merges the given values into a MW global array variable.
* Useful for setting some entries in a configuration array, instead of
/**
* Merges the given values into a MW global array variable.
* Useful for setting some entries in a configuration array, instead of