Вход Регистрация
Файл: vendor/laravel/framework/src/Illuminate/Support/Reflector.php
Строк: 152
<?php

namespace IlluminateSupport;

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)
    {
        if (! 
$parameter->getType() instanceof ReflectionNamedType) {
            return 
false;
        }

        
$backedEnumClass = $parameter->getType()?->getName();

        if (
is_null($backedEnumClass)) {
            return 
false;
        }

        if (
enum_exists($backedEnumClass)) {
            
$reflectionBackedEnum = new ReflectionEnum($backedEnumClass);

            return 
$reflectionBackedEnum->isBacked()
                && 
$reflectionBackedEnum->getBackingType()->getName() == 'string';
        }

        return 
false;
    }
}
Онлайн: 2
Реклама