mirror of
https://github.com/Icinga/icinga-php-library.git
synced 2025-09-29 04:28:45 +02:00
159 lines
4.9 KiB
PHP
159 lines
4.9 KiB
PHP
<?php
|
|
|
|
/*
|
|
* This file is part of the Symfony package.
|
|
*
|
|
* (c) Fabien Potencier <fabien@symfony.com>
|
|
*
|
|
* For the full copyright and license information, please view the LICENSE
|
|
* file that was distributed with this source code.
|
|
*/
|
|
|
|
if (\PHP_VERSION_ID < 80400) {
|
|
/**
|
|
* @author Daniel Scherzer <daniel.e.scherzer@gmail.com>
|
|
*/
|
|
final class ReflectionConstant
|
|
{
|
|
/**
|
|
* @var string
|
|
*
|
|
* @readonly
|
|
*/
|
|
public $name;
|
|
|
|
private $value;
|
|
private $deprecated;
|
|
|
|
private static $persistentConstants = [];
|
|
|
|
public function __construct(string $name)
|
|
{
|
|
if (!defined($name) || false !== strpos($name, '::')) {
|
|
throw new ReflectionException("Constant \"$name\" does not exist");
|
|
}
|
|
|
|
$this->name = ltrim($name, '\\');
|
|
$deprecated = false;
|
|
$eh = set_error_handler(static function ($type, $msg, $file, $line) use ($name, &$deprecated, &$eh) {
|
|
if (\E_DEPRECATED === $type && "Constant $name is deprecated" === $msg) {
|
|
return $deprecated = true;
|
|
}
|
|
|
|
return $eh && $eh($type, $msg, $file, $line);
|
|
});
|
|
|
|
try {
|
|
$this->value = constant($name);
|
|
$this->deprecated = $deprecated;
|
|
} finally {
|
|
restore_error_handler();
|
|
}
|
|
}
|
|
|
|
public function getName(): string
|
|
{
|
|
return $this->name;
|
|
}
|
|
|
|
public function getValue()
|
|
{
|
|
return $this->value;
|
|
}
|
|
|
|
public function getNamespaceName(): string
|
|
{
|
|
if (false === $slashPos = strrpos($this->name, '\\')) {
|
|
return '';
|
|
}
|
|
|
|
return substr($this->name, 0, $slashPos);
|
|
}
|
|
|
|
public function getShortName(): string
|
|
{
|
|
if (false === $slashPos = strrpos($this->name, '\\')) {
|
|
return $this->name;
|
|
}
|
|
|
|
return substr($this->name, $slashPos + 1);
|
|
}
|
|
|
|
public function isDeprecated(): bool
|
|
{
|
|
return $this->deprecated;
|
|
}
|
|
|
|
public function __toString(): string
|
|
{
|
|
// A constant is persistent if provided by PHP itself rather than
|
|
// being defined by users. If we got here, we know that it *is*
|
|
// defined, so we just need to figure out if it is defined by the
|
|
// user or not
|
|
if (!self::$persistentConstants) {
|
|
$persistentConstants = get_defined_constants(true);
|
|
unset($persistentConstants['user']);
|
|
foreach ($persistentConstants as $constants) {
|
|
self::$persistentConstants += $constants;
|
|
}
|
|
}
|
|
$persistent = array_key_exists($this->name, self::$persistentConstants);
|
|
|
|
// Can't match the inclusion of `no_file_cache` but the rest is
|
|
// possible to match
|
|
$result = 'Constant [ ';
|
|
if ($persistent || $this->deprecated) {
|
|
$result .= '<';
|
|
if ($persistent) {
|
|
$result .= 'persistent';
|
|
if ($this->deprecated) {
|
|
$result .= ', ';
|
|
}
|
|
}
|
|
if ($this->deprecated) {
|
|
$result .= 'deprecated';
|
|
}
|
|
$result .= '> ';
|
|
}
|
|
// Cannot just use gettype() to match zend_zval_type_name()
|
|
if (is_object($this->value)) {
|
|
$result .= \PHP_VERSION_ID >= 80000 ? get_debug_type($this->value) : gettype($this->value);
|
|
} elseif (is_bool($this->value)) {
|
|
$result .= 'bool';
|
|
} elseif (is_int($this->value)) {
|
|
$result .= 'int';
|
|
} elseif (is_float($this->value)) {
|
|
$result .= 'float';
|
|
} elseif (null === $this->value) {
|
|
$result .= 'null';
|
|
} else {
|
|
$result .= gettype($this->value);
|
|
}
|
|
$result .= ' ';
|
|
$result .= $this->name;
|
|
$result .= ' ] { ';
|
|
if (is_array($this->value)) {
|
|
$result .= 'Array';
|
|
} else {
|
|
// This will throw an exception if the value is an object that
|
|
// cannot be converted to string; that is expected and matches
|
|
// the behavior of zval_get_string_func()
|
|
$result .= (string) $this->value;
|
|
}
|
|
$result .= " }\n";
|
|
|
|
return $result;
|
|
}
|
|
|
|
public function __sleep(): array
|
|
{
|
|
throw new Exception("Serialization of 'ReflectionConstant' is not allowed");
|
|
}
|
|
|
|
public function __wakeup(): void
|
|
{
|
|
throw new Exception("Unserialization of 'ReflectionConstant' is not allowed");
|
|
}
|
|
}
|
|
}
|