1 | <?php |
||
11 | final class Reflection |
||
12 | { |
||
13 | private function __construct() |
||
17 | |||
18 | /** |
||
19 | * @param callable $function |
||
20 | * |
||
21 | * @return \ReflectionFunctionAbstract |
||
22 | * @throws InvalidFunctionException |
||
23 | */ |
||
24 | final public static function fromCallable(callable $function) |
||
25 | { |
||
26 | // If is array it could be an instance or static method: |
||
27 | // ['class', 'method'] or [$instance, 'method']; |
||
28 | if (is_array($function)) { |
||
29 | return new \ReflectionMethod($function[0], $function[1]); |
||
30 | } |
||
31 | // If it is a closure it could be an actual closure or |
||
32 | // possibly a closure of another function from |
||
33 | // \ReflectionFunction::getClosure or \ReflectionMethod::getClosure |
||
34 | elseif ($function instanceof \Closure) { |
||
35 | $reflection = new \ReflectionFunction($function); |
||
36 | |||
37 | // If the name is {closure} it as an actual closure |
||
38 | if ($reflection->getShortName() === '{closure}') { |
||
39 | return $reflection; |
||
40 | } |
||
41 | // Bail out, no (sane) way of determining the actual function |
||
42 | // represented by the closure |
||
43 | throw InvalidFunctionException::invalidFunctionMessage( |
||
44 | 'The function has been wrapped in closure ' |
||
45 | . '(most likely via ReflectionFunction::getClosure or \ReflectionMethod::getClosure) ' |
||
46 | . 'and this is not supported', |
||
47 | $reflection); |
||
48 | } |
||
49 | // If an object but not a closure it must be an object defining |
||
50 | // the __invoke magic method. |
||
51 | elseif (is_object($function)) { |
||
52 | return new \ReflectionMethod($function, '__invoke'); |
||
53 | } |
||
54 | // Fallback to function |
||
55 | else { |
||
56 | $name = null; |
||
57 | is_callable($function, false, $name); |
||
58 | |||
59 | return new \ReflectionFunction($name); |
||
60 | } |
||
61 | } |
||
62 | |||
63 | private static $supportsVariadicParameters = null; |
||
64 | |||
65 | /** |
||
66 | * @param \ReflectionFunctionAbstract $function |
||
67 | * |
||
68 | * @return boolean |
||
69 | */ |
||
70 | public static function isVariadic(\ReflectionFunctionAbstract $function) |
||
86 | } |
||
87 |