setUserOnly((bool) $userOnly); $this->setPrefix((string) $prefix); $this->setSuffix((string) $suffix); if (true === $enableKeyProcessing) { $this->enableKeyProcessing(); } $this->loadConstants(); } /** * @return bool */ public function getUserOnly() { return $this->userOnly; } /** * Should we use only user-defined constants? * * @param bool $userOnly * @return self */ public function setUserOnly($userOnly) { $this->userOnly = (bool) $userOnly; return $this; } /** * Load all currently defined constants into parser. * * @return void */ public function loadConstants() { if ($this->userOnly) { $constants = get_defined_constants(true); $constants = isset($constants['user']) ? $constants['user'] : []; $this->setTokens($constants); } else { $this->setTokens(get_defined_constants()); } } /** * Get current token registry. * @return array */ public function getTokens() { return $this->tokens; } /** * Override processing of individual value. * * If the value is a string and evaluates to a class constant, returns * the class constant value; otherwise, delegates to the parent. * * @param mixed $value * @param array $replacements * @return mixed */ protected function doProcess($value, array $replacements) { if (! is_string($value)) { return parent::doProcess($value, $replacements); } if (false === strpos($value, '::')) { return parent::doProcess($value, $replacements); } // Handle class constants if (defined($value)) { return constant($value); } // Handle ::class notation if (! preg_match('/::class$/i', $value)) { return parent::doProcess($value, $replacements); } $class = substr($value, 0, strlen($value) - 7); if (class_exists($class)) { return $class; } // While we've matched ::class, the class does not exist, and PHP will // raise an error if you try to define a constant using that notation. // As such, we have something that cannot possibly be a constant, so we // can safely return the value verbatim. return $value; } }