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@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@0: /** Chris@0: * @param Snapshot $snapshot Chris@0: * @return string Chris@0: */ Chris@0: public function constants(Snapshot $snapshot) Chris@0: { Chris@0: $result = ''; Chris@0: Chris@0: foreach ($snapshot->constants() as $name => $value) { Chris@0: $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@0: /** Chris@0: * @param Snapshot $snapshot Chris@0: * @return string Chris@0: */ Chris@0: public function iniSettings(Snapshot $snapshot) Chris@0: { Chris@0: $result = ''; Chris@0: Chris@0: foreach ($snapshot->iniSettings() as $key => $value) { Chris@0: $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@0: /** Chris@0: * @param mixed $variable Chris@0: * @return string Chris@0: */ Chris@0: private function exportVariable($variable) Chris@0: { Chris@0: if (is_scalar($variable) || is_null($variable) || Chris@0: (is_array($variable) && $this->arrayOnlyContainsScalars($variable))) { Chris@0: return var_export($variable, true); Chris@0: } Chris@0: Chris@0: return 'unserialize(' . var_export(serialize($variable), true) . ')'; Chris@0: } Chris@0: Chris@0: /** Chris@0: * @param array $array Chris@0: * @return bool Chris@0: */ Chris@0: private function arrayOnlyContainsScalars(array $array) Chris@0: { Chris@0: $result = true; Chris@0: Chris@0: foreach ($array as $element) { Chris@0: if (is_array($element)) { Chris@0: $result = self::arrayOnlyContainsScalars($element); Chris@0: } 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: }