Skip to main content
Drupal API
User account menu
  • Log in

Breadcrumb

  1. Drupal Core 11.1.x
  2. UndefinedFunctionErrorEnhancer.php

class UndefinedFunctionErrorEnhancer

@author Fabien Potencier <fabien@symfony.com>

Hierarchy

  • class \Symfony\Component\ErrorHandler\ErrorEnhancer\UndefinedFunctionErrorEnhancer implements \Symfony\Component\ErrorHandler\ErrorEnhancer\ErrorEnhancerInterface

Expanded class hierarchy of UndefinedFunctionErrorEnhancer

1 file declares its use of UndefinedFunctionErrorEnhancer
ErrorHandler.php in vendor/symfony/error-handler/ErrorHandler.php

File

vendor/symfony/error-handler/ErrorEnhancer/UndefinedFunctionErrorEnhancer.php, line 20

Namespace

Symfony\Component\ErrorHandler\ErrorEnhancer
View source
class UndefinedFunctionErrorEnhancer implements ErrorEnhancerInterface {
    public function enhance(\Throwable $error) : ?\Throwable {
        if ($error instanceof FatalError) {
            return null;
        }
        $message = $error->getMessage();
        $messageLen = \strlen($message);
        $notFoundSuffix = '()';
        $notFoundSuffixLen = \strlen($notFoundSuffix);
        if ($notFoundSuffixLen > $messageLen) {
            return null;
        }
        if (0 !== substr_compare($message, $notFoundSuffix, -$notFoundSuffixLen)) {
            return null;
        }
        $prefix = 'Call to undefined function ';
        $prefixLen = \strlen($prefix);
        if (!str_starts_with($message, $prefix)) {
            return null;
        }
        $fullyQualifiedFunctionName = substr($message, $prefixLen, -$notFoundSuffixLen);
        if (false !== ($namespaceSeparatorIndex = strrpos($fullyQualifiedFunctionName, '\\'))) {
            $functionName = substr($fullyQualifiedFunctionName, $namespaceSeparatorIndex + 1);
            $namespacePrefix = substr($fullyQualifiedFunctionName, 0, $namespaceSeparatorIndex);
            $message = \sprintf('Attempted to call function "%s" from namespace "%s".', $functionName, $namespacePrefix);
        }
        else {
            $functionName = $fullyQualifiedFunctionName;
            $message = \sprintf('Attempted to call function "%s" from the global namespace.', $functionName);
        }
        $candidates = [];
        foreach (get_defined_functions() as $type => $definedFunctionNames) {
            foreach ($definedFunctionNames as $definedFunctionName) {
                if (false !== ($namespaceSeparatorIndex = strrpos($definedFunctionName, '\\'))) {
                    $definedFunctionNameBasename = substr($definedFunctionName, $namespaceSeparatorIndex + 1);
                }
                else {
                    $definedFunctionNameBasename = $definedFunctionName;
                }
                if ($definedFunctionNameBasename === $functionName) {
                    $candidates[] = '\\' . $definedFunctionName;
                }
            }
        }
        if ($candidates) {
            sort($candidates);
            $last = array_pop($candidates) . '"?';
            if ($candidates) {
                $candidates = 'e.g. "' . implode('", "', $candidates) . '" or "' . $last;
            }
            else {
                $candidates = '"' . $last;
            }
            $message .= "\nDid you mean to call " . $candidates;
        }
        return new UndefinedFunctionError($message, $error);
    }

}

Members

Title Sort descending Modifiers Object type Summary Overriden Title
UndefinedFunctionErrorEnhancer::enhance public function Returns an \Throwable instance if the class is able to improve the error, null otherwise. Overrides ErrorEnhancerInterface::enhance

API Navigation

  • Drupal Core 11.1.x
  • Topics
  • Classes
  • Functions
  • Constants
  • Globals
  • Files
  • Namespaces
  • Deprecated
  • Services
RSS feed
Powered by Drupal