Chris@0: Chris@0: * Chris@0: * For the full copyright and license information, please view the LICENSE Chris@0: * file that was distributed with this source code. Chris@0: */ Chris@0: Chris@14: declare(strict_types=1); Chris@14: Chris@0: namespace SebastianBergmann\GlobalState; Chris@0: Chris@0: /** Chris@0: * Exports parts of a Snapshot as PHP code. Chris@0: */ Chris@0: class CodeExporter Chris@0: { Chris@14: public function constants(Snapshot $snapshot): string Chris@0: { Chris@0: $result = ''; Chris@0: Chris@0: foreach ($snapshot->constants() as $name => $value) { Chris@14: $result .= \sprintf( Chris@0: 'if (!defined(\'%s\')) define(\'%s\', %s);' . "\n", Chris@0: $name, Chris@0: $name, Chris@0: $this->exportVariable($value) Chris@0: ); Chris@0: } Chris@0: Chris@0: return $result; Chris@0: } Chris@0: Chris@14: public function globalVariables(Snapshot $snapshot): string Chris@14: { Chris@14: $result = '$GLOBALS = [];' . PHP_EOL; Chris@14: Chris@14: foreach ($snapshot->globalVariables() as $name => $value) { Chris@14: $result .= \sprintf( Chris@14: '$GLOBALS[%s] = %s;' . PHP_EOL, Chris@14: $this->exportVariable($name), Chris@14: $this->exportVariable($value) Chris@14: ); Chris@14: } Chris@14: Chris@14: return $result; Chris@14: } Chris@14: Chris@14: public function iniSettings(Snapshot $snapshot): string Chris@0: { Chris@0: $result = ''; Chris@0: Chris@0: foreach ($snapshot->iniSettings() as $key => $value) { Chris@14: $result .= \sprintf( Chris@0: '@ini_set(%s, %s);' . "\n", Chris@0: $this->exportVariable($key), Chris@0: $this->exportVariable($value) Chris@0: ); Chris@0: } Chris@0: Chris@0: return $result; Chris@0: } Chris@0: Chris@14: private function exportVariable($variable): string Chris@0: { Chris@14: if (\is_scalar($variable) || \is_null($variable) || Chris@14: (\is_array($variable) && $this->arrayOnlyContainsScalars($variable))) { Chris@14: return \var_export($variable, true); Chris@0: } Chris@0: Chris@14: return 'unserialize(' . \var_export(\serialize($variable), true) . ')'; Chris@0: } Chris@0: Chris@14: private function arrayOnlyContainsScalars(array $array): bool Chris@0: { Chris@0: $result = true; Chris@0: Chris@0: foreach ($array as $element) { Chris@14: if (\is_array($element)) { Chris@0: $result = self::arrayOnlyContainsScalars($element); Chris@14: } elseif (!\is_scalar($element) && !\is_null($element)) { Chris@0: $result = false; Chris@0: } Chris@0: Chris@0: if ($result === false) { Chris@0: break; Chris@0: } Chris@0: } Chris@0: Chris@0: return $result; Chris@0: } Chris@0: }