<?php namespace Illuminate\Support; use ReflectionClass; use ReflectionEnum; use ReflectionMethod; use ReflectionNamedType; use ReflectionUnionType; class Reflector { /** * This is a PHP 7.4 compatible implementation of is_callable. * * @param mixed $var * @param bool $syntaxOnly * @return bool */ public static function isCallable($var, $syntaxOnly = false) { if (! is_array($var)) { return is_callable($var, $syntaxOnly); } if (! isset($var[0], $var[1]) || ! is_string($var[1] ?? null)) { return false; } if ($syntaxOnly && (is_string($var[0]) || is_object($var[0])) && is_string($var[1])) { return true; } $class = is_object($var[0]) ? get_class($var[0]) : $var[0]; $method = $var[1]; if (! class_exists($class)) { return false; } if (method_exists($class, $method)) { return (new ReflectionMethod($class, $method))->isPublic(); } if (is_object($var[0]) && method_exists($class, '__call')) { return (new ReflectionMethod($class, '__call'))->isPublic(); } if (! is_object($var[0]) && method_exists($class, '__callStatic')) { return (new ReflectionMethod($class, '__callStatic'))->isPublic(); } return false; } /** * Get the class name of the given parameter's type, if possible. * * @param \ReflectionParameter $parameter * @return string|null */ public static function getParameterClassName($parameter) { $type = $parameter->getType(); if (! $type instanceof ReflectionNamedType || $type->isBuiltin()) { return; } return static::getTypeName($parameter, $type); } /** * Get the class names of the given parameter's type, including union types. * * @param \ReflectionParameter $parameter * @return array */ public static function getParameterClassNames($parameter) { $type = $parameter->getType(); if (! $type instanceof ReflectionUnionType) { return array_filter([static::getParameterClassName($parameter)]); } $unionTypes = []; foreach ($type->getTypes() as $listedType) { if (! $listedType instanceof ReflectionNamedType || $listedType->isBuiltin()) { continue; } $unionTypes[] = static::getTypeName($parameter, $listedType); } return array_filter($unionTypes); } /** * Get the given type's class name. * * @param \ReflectionParameter $parameter * @param \ReflectionNamedType $type * @return string */ protected static function getTypeName($parameter, $type) { $name = $type->getName(); if (! is_null($class = $parameter->getDeclaringClass())) { if ($name === 'self') { return $class->getName(); } if ($name === 'parent' && $parent = $class->getParentClass()) { return $parent->getName(); } } return $name; } /** * Determine if the parameter's type is a subclass of the given type. * * @param \ReflectionParameter $parameter * @param string $className * @return bool */ public static function isParameterSubclassOf($parameter, $className) { $paramClassName = static::getParameterClassName($parameter); return $paramClassName && (class_exists($paramClassName) || interface_exists($paramClassName)) && (new ReflectionClass($paramClassName))->isSubclassOf($className); } /** * Determine if the parameter's type is a Backed Enum with a string backing type. * * @param \ReflectionParameter $parameter * @return bool */ public static function isParameterBackedEnumWithStringBackingType($parameter) { $backedEnumClass = (string) $parameter->getType(); if (enum_exists($backedEnumClass)) { $reflectionBackedEnum = new ReflectionEnum($backedEnumClass); return $reflectionBackedEnum->isBacked() && $reflectionBackedEnum->getBackingType()->getName() == 'string'; } return false; } }
Name | Type | Size | Permission | Actions |
---|---|---|---|---|
Exceptions | Folder | 0755 |
|
|
Facades | Folder | 0755 |
|
|
Testing | Folder | 0755 |
|
|
Traits | Folder | 0755 |
|
|
AggregateServiceProvider.php | File | 995 B | 0644 |
|
Benchmark.php | File | 1.49 KB | 0644 |
|
Carbon.php | File | 425 B | 0644 |
|
Composer.php | File | 2.82 KB | 0644 |
|
ConfigurationUrlParser.php | File | 4.25 KB | 0644 |
|
DateFactory.php | File | 7.76 KB | 0644 |
|
Env.php | File | 2.36 KB | 0644 |
|
Fluent.php | File | 4.14 KB | 0644 |
|
HigherOrderTapProxy.php | File | 665 B | 0644 |
|
HtmlString.php | File | 1.03 KB | 0644 |
|
InteractsWithTime.php | File | 1.55 KB | 0644 |
|
Js.php | File | 3.44 KB | 0644 |
|
LICENSE.md | File | 1.05 KB | 0644 |
|
Lottery.php | File | 5.66 KB | 0644 |
|
Manager.php | File | 4.46 KB | 0644 |
|
MessageBag.php | File | 9.8 KB | 0644 |
|
MultipleInstanceManager.php | File | 4.25 KB | 0644 |
|
NamespacedItemResolver.php | File | 3.35 KB | 0644 |
|
Optional.php | File | 2.64 KB | 0644 |
|
Pluralizer.php | File | 2.84 KB | 0644 |
|
ProcessUtils.php | File | 2 KB | 0644 |
|
Reflector.php | File | 4.32 KB | 0644 |
|
ServiceProvider.php | File | 10.76 KB | 0644 |
|
Str.php | File | 36.68 KB | 0644 |
|
Stringable.php | File | 29.75 KB | 0644 |
|
Timebox.php | File | 1.62 KB | 0644 |
|
ValidatedInput.php | File | 4.61 KB | 0644 |
|
ViewErrorBag.php | File | 2.57 KB | 0644 |
|
composer.json | File | 1.74 KB | 0644 |
|
helpers.php | File | 10.08 KB | 0644 |
|