You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
174 lines
3.6 KiB
174 lines
3.6 KiB
<?php |
|
|
|
/* |
|
* This file is part of Psy Shell. |
|
* |
|
* (c) 2012-2023 Justin Hileman |
|
* |
|
* For the full copyright and license information, please view the LICENSE |
|
* file that was distributed with this source code. |
|
*/ |
|
|
|
namespace Psy\Reflection; |
|
|
|
/** |
|
* Somehow the standard reflection library doesn't include constants. |
|
* |
|
* ReflectionConstant_ corrects that omission. |
|
* |
|
* Note: For backwards compatibility reasons, this class is named |
|
* ReflectionConstant_ rather than ReflectionConstant. It will be renamed in |
|
* v0.10.0. |
|
*/ |
|
class ReflectionConstant_ implements \Reflector |
|
{ |
|
public $name; |
|
private $value; |
|
|
|
private static $magicConstants = [ |
|
'__LINE__', |
|
'__FILE__', |
|
'__DIR__', |
|
'__FUNCTION__', |
|
'__CLASS__', |
|
'__TRAIT__', |
|
'__METHOD__', |
|
'__NAMESPACE__', |
|
'__COMPILER_HALT_OFFSET__', |
|
]; |
|
|
|
/** |
|
* Construct a ReflectionConstant_ object. |
|
* |
|
* @param string $name |
|
*/ |
|
public function __construct(string $name) |
|
{ |
|
$this->name = $name; |
|
|
|
if (!\defined($name) && !self::isMagicConstant($name)) { |
|
throw new \InvalidArgumentException('Unknown constant: '.$name); |
|
} |
|
|
|
if (!self::isMagicConstant($name)) { |
|
$this->value = @\constant($name); |
|
} |
|
} |
|
|
|
/** |
|
* Exports a reflection. |
|
* |
|
* @param string $name |
|
* @param bool $return pass true to return the export, as opposed to emitting it |
|
* |
|
* @return string|null |
|
*/ |
|
public static function export(string $name, bool $return = false) |
|
{ |
|
$refl = new self($name); |
|
$value = $refl->getValue(); |
|
|
|
$str = \sprintf('Constant [ %s %s ] { %s }', \gettype($value), $refl->getName(), $value); |
|
|
|
if ($return) { |
|
return $str; |
|
} |
|
|
|
echo $str."\n"; |
|
} |
|
|
|
public static function isMagicConstant($name) |
|
{ |
|
return \in_array($name, self::$magicConstants); |
|
} |
|
|
|
/** |
|
* Get the constant's docblock. |
|
* |
|
* @return false |
|
*/ |
|
public function getDocComment(): bool |
|
{ |
|
return false; |
|
} |
|
|
|
/** |
|
* Gets the constant name. |
|
*/ |
|
public function getName(): string |
|
{ |
|
return $this->name; |
|
} |
|
|
|
/** |
|
* Gets the namespace name. |
|
* |
|
* Returns '' when the constant is not namespaced. |
|
*/ |
|
public function getNamespaceName(): string |
|
{ |
|
if (!$this->inNamespace()) { |
|
return ''; |
|
} |
|
|
|
return \preg_replace('/\\\\[^\\\\]+$/', '', $this->name); |
|
} |
|
|
|
/** |
|
* Gets the value of the constant. |
|
* |
|
* @return mixed |
|
*/ |
|
public function getValue() |
|
{ |
|
return $this->value; |
|
} |
|
|
|
/** |
|
* Checks if this constant is defined in a namespace. |
|
*/ |
|
public function inNamespace(): bool |
|
{ |
|
return \strpos($this->name, '\\') !== false; |
|
} |
|
|
|
/** |
|
* To string. |
|
*/ |
|
public function __toString(): string |
|
{ |
|
return $this->getName(); |
|
} |
|
|
|
/** |
|
* Gets the constant's file name. |
|
* |
|
* Currently returns null, because if it returns a file name the signature |
|
* formatter will barf. |
|
*/ |
|
public function getFileName() |
|
{ |
|
return; |
|
// return $this->class->getFileName(); |
|
} |
|
|
|
/** |
|
* Get the code start line. |
|
* |
|
* @throws \RuntimeException |
|
*/ |
|
public function getStartLine() |
|
{ |
|
throw new \RuntimeException('Not yet implemented because it\'s unclear what I should do here :)'); |
|
} |
|
|
|
/** |
|
* Get the code end line. |
|
* |
|
* @throws \RuntimeException |
|
*/ |
|
public function getEndLine() |
|
{ |
|
return $this->getStartLine(); |
|
} |
|
}
|
|
|