Server IP : 127.0.0.2 / Your IP : 3.142.92.19 Web Server : Apache/2.4.18 (Ubuntu) System : User : www-data ( ) PHP Version : 7.0.33-0ubuntu0.16.04.16 Disable Function : disk_free_space,disk_total_space,diskfreespace,dl,exec,fpaththru,getmyuid,getmypid,highlight_file,ignore_user_abord,leak,listen,link,opcache_get_configuration,opcache_get_status,passthru,pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,php_uname,phpinfo,posix_ctermid,posix_getcwd,posix_getegid,posix_geteuid,posix_getgid,posix_getgrgid,posix_getgrnam,posix_getgroups,posix_getlogin,posix_getpgid,posix_getpgrp,posix_getpid,posix,_getppid,posix_getpwnam,posix_getpwuid,posix_getrlimit,posix_getsid,posix_getuid,posix_isatty,posix_kill,posix_mkfifo,posix_setegid,posix_seteuid,posix_setgid,posix_setpgid,posix_setsid,posix_setuid,posix_times,posix_ttyname,posix_uname,pclose,popen,proc_open,proc_close,proc_get_status,proc_nice,proc_terminate,shell_exec,source,show_source,system,virtual MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : ON | Sudo : ON | Pkexec : ON Directory : /var/www/html/vendor/sebastian/global-state/src/ |
Upload File : |
<?php /* * This file is part of the GlobalState package. * * (c) Sebastian Bergmann <sebastian@phpunit.de> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\GlobalState; use ReflectionClass; use Serializable; /** * A snapshot of global state. */ class Snapshot { /** * @var Blacklist */ private $blacklist; /** * @var array */ private $globalVariables = array(); /** * @var array */ private $superGlobalArrays = array(); /** * @var array */ private $superGlobalVariables = array(); /** * @var array */ private $staticAttributes = array(); /** * @var array */ private $iniSettings = array(); /** * @var array */ private $includedFiles = array(); /** * @var array */ private $constants = array(); /** * @var array */ private $functions = array(); /** * @var array */ private $interfaces = array(); /** * @var array */ private $classes = array(); /** * @var array */ private $traits = array(); /** * Creates a snapshot of the current global state. * * @param Blacklist $blacklist * @param bool $includeGlobalVariables * @param bool $includeStaticAttributes * @param bool $includeConstants * @param bool $includeFunctions * @param bool $includeClasses * @param bool $includeInterfaces * @param bool $includeTraits * @param bool $includeIniSettings * @param bool $includeIncludedFiles */ public function __construct(Blacklist $blacklist = null, $includeGlobalVariables = true, $includeStaticAttributes = true, $includeConstants = true, $includeFunctions = true, $includeClasses = true, $includeInterfaces = true, $includeTraits = true, $includeIniSettings = true, $includeIncludedFiles = true) { if ($blacklist === null) { $blacklist = new Blacklist; } $this->blacklist = $blacklist; if ($includeConstants) { $this->snapshotConstants(); } if ($includeFunctions) { $this->snapshotFunctions(); } if ($includeClasses || $includeStaticAttributes) { $this->snapshotClasses(); } if ($includeInterfaces) { $this->snapshotInterfaces(); } if ($includeGlobalVariables) { $this->setupSuperGlobalArrays(); $this->snapshotGlobals(); } if ($includeStaticAttributes) { $this->snapshotStaticAttributes(); } if ($includeIniSettings) { $this->iniSettings = ini_get_all(null, false); } if ($includeIncludedFiles) { $this->includedFiles = get_included_files(); } if (function_exists('get_declared_traits')) { $this->traits = get_declared_traits(); } } /** * @return Blacklist */ public function blacklist() { return $this->blacklist; } /** * @return array */ public function globalVariables() { return $this->globalVariables; } /** * @return array */ public function superGlobalVariables() { return $this->superGlobalVariables; } /** * Returns a list of all super-global variable arrays. * * @return array */ public function superGlobalArrays() { return $this->superGlobalArrays; } /** * @return array */ public function staticAttributes() { return $this->staticAttributes; } /** * @return array */ public function iniSettings() { return $this->iniSettings; } /** * @return array */ public function includedFiles() { return $this->includedFiles; } /** * @return array */ public function constants() { return $this->constants; } /** * @return array */ public function functions() { return $this->functions; } /** * @return array */ public function interfaces() { return $this->interfaces; } /** * @return array */ public function classes() { return $this->classes; } /** * @return array */ public function traits() { return $this->traits; } /** * Creates a snapshot user-defined constants. */ private function snapshotConstants() { $constants = get_defined_constants(true); if (isset($constants['user'])) { $this->constants = $constants['user']; } } /** * Creates a snapshot user-defined functions. */ private function snapshotFunctions() { $functions = get_defined_functions(); $this->functions = $functions['user']; } /** * Creates a snapshot user-defined classes. */ private function snapshotClasses() { foreach (array_reverse(get_declared_classes()) as $className) { $class = new ReflectionClass($className); if (!$class->isUserDefined()) { break; } $this->classes[] = $className; } $this->classes = array_reverse($this->classes); } /** * Creates a snapshot user-defined interfaces. */ private function snapshotInterfaces() { foreach (array_reverse(get_declared_interfaces()) as $interfaceName) { $class = new ReflectionClass($interfaceName); if (!$class->isUserDefined()) { break; } $this->interfaces[] = $interfaceName; } $this->interfaces = array_reverse($this->interfaces); } /** * Creates a snapshot of all global and super-global variables. */ private function snapshotGlobals() { $superGlobalArrays = $this->superGlobalArrays(); foreach ($superGlobalArrays as $superGlobalArray) { $this->snapshotSuperGlobalArray($superGlobalArray); } foreach (array_keys($GLOBALS) as $key) { if ($key != 'GLOBALS' && !in_array($key, $superGlobalArrays) && $this->canBeSerialized($GLOBALS[$key]) && !$this->blacklist->isGlobalVariableBlacklisted($key)) { $this->globalVariables[$key] = unserialize(serialize($GLOBALS[$key])); } } } /** * Creates a snapshot a super-global variable array. * * @param $superGlobalArray */ private function snapshotSuperGlobalArray($superGlobalArray) { $this->superGlobalVariables[$superGlobalArray] = array(); if (isset($GLOBALS[$superGlobalArray]) && is_array($GLOBALS[$superGlobalArray])) { foreach ($GLOBALS[$superGlobalArray] as $key => $value) { $this->superGlobalVariables[$superGlobalArray][$key] = unserialize(serialize($value)); } } } /** * Creates a snapshot of all static attributes in user-defined classes. */ private function snapshotStaticAttributes() { foreach ($this->classes as $className) { $class = new ReflectionClass($className); $snapshot = array(); foreach ($class->getProperties() as $attribute) { if ($attribute->isStatic()) { $name = $attribute->getName(); if ($this->blacklist->isStaticAttributeBlacklisted($className, $name)) { continue; } $attribute->setAccessible(true); $value = $attribute->getValue(); if ($this->canBeSerialized($value)) { $snapshot[$name] = unserialize(serialize($value)); } } } if (!empty($snapshot)) { $this->staticAttributes[$className] = $snapshot; } } } /** * Returns a list of all super-global variable arrays. * * @return array */ private function setupSuperGlobalArrays() { $this->superGlobalArrays = array( '_ENV', '_POST', '_GET', '_COOKIE', '_SERVER', '_FILES', '_REQUEST' ); if (ini_get('register_long_arrays') == '1') { $this->superGlobalArrays = array_merge( $this->superGlobalArrays, array( 'HTTP_ENV_VARS', 'HTTP_POST_VARS', 'HTTP_GET_VARS', 'HTTP_COOKIE_VARS', 'HTTP_SERVER_VARS', 'HTTP_POST_FILES' ) ); } } /** * @param mixed $variable * @return bool * @todo Implement this properly */ private function canBeSerialized($variable) { if (!is_object($variable)) { return !is_resource($variable); } if ($variable instanceof \stdClass) { return true; } $class = new ReflectionClass($variable); do { if ($class->isInternal()) { return $variable instanceof Serializable; } } while ($class = $class->getParentClass()); return true; } }