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

Breadcrumb

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

class ReflectionCallable

@author Fabien Potencier <fabien@symfony.com>

@internal

Hierarchy

  • class \Twig\Util\ReflectionCallable

Expanded class hierarchy of ReflectionCallable

2 files declare their use of ReflectionCallable
CallExpression.php in vendor/twig/twig/src/Node/Expression/CallExpression.php
Parser.php in vendor/twig/twig/src/Parser.php

File

vendor/twig/twig/src/Util/ReflectionCallable.php, line 21

Namespace

Twig\Util
View source
final class ReflectionCallable {
    private $reflector;
    private $callable;
    private $name;
    public function __construct(TwigCallableInterface $twigCallable) {
        $callable = $twigCallable->getCallable();
        if (\is_string($callable) && false !== ($pos = strpos($callable, '::'))) {
            $callable = [
                substr($callable, 0, $pos),
                substr($callable, 2 + $pos),
            ];
        }
        if (\is_array($callable) && method_exists($callable[0], $callable[1])) {
            $this->reflector = $r = new \ReflectionMethod($callable[0], $callable[1]);
            $this->callable = $callable;
            $this->name = $r->class . '::' . $r->name;
            return;
        }
        $checkVisibility = $callable instanceof \Closure;
        try {
            $closure = \Closure::fromCallable($callable);
        } catch (\TypeError $e) {
            throw new \LogicException(\sprintf('Callback for %s "%s" is not callable in the current scope.', $twigCallable->getType(), $twigCallable->getName()), 0, $e);
        }
        $this->reflector = $r = new \ReflectionFunction($closure);
        if (str_contains($r->name, '{closure')) {
            $this->callable = $callable;
            $this->name = 'Closure';
            return;
        }
        if ($object = $r->getClosureThis()) {
            $callable = [
                $object,
                $r->name,
            ];
            $this->name = get_debug_type($object) . '::' . $r->name;
        }
        elseif (\PHP_VERSION_ID >= 80111 && ($class = $r->getClosureCalledClass())) {
            $callable = [
                $class->name,
                $r->name,
            ];
            $this->name = $class->name . '::' . $r->name;
        }
        elseif (\PHP_VERSION_ID < 80111 && ($class = $r->getClosureScopeClass())) {
            $callable = [
                \is_array($callable) ? $callable[0] : $class->name,
                $r->name,
            ];
            $this->name = (\is_array($callable) ? $callable[0] : $class->name) . '::' . $r->name;
        }
        else {
            $callable = $this->name = $r->name;
        }
        if ($checkVisibility && \is_array($callable) && method_exists(...$callable) && !(new \ReflectionMethod(...$callable))->isPublic()) {
            $callable = $r->getClosure();
        }
        $this->callable = $callable;
    }
    public function getReflector() : \ReflectionFunctionAbstract {
        return $this->reflector;
    }
    public function getCallable() {
        return $this->callable;
    }
    public function getName() : string {
        return $this->name;
    }

}

Members

Title Sort descending Modifiers Object type Summary
ReflectionCallable::$callable private property
ReflectionCallable::$name private property
ReflectionCallable::$reflector private property
ReflectionCallable::getCallable public function
ReflectionCallable::getName public function
ReflectionCallable::getReflector public function
ReflectionCallable::__construct public function

API Navigation

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