1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
|
<?php declare(strict_types=1);
namespace Automattic\WooCommerce\Vendor\League\Container;
use Automattic\WooCommerce\Vendor\League\Container\Argument\{ArgumentResolverInterface, ArgumentResolverTrait}; use Automattic\WooCommerce\Vendor\League\Container\Exception\NotFoundException; use Automattic\WooCommerce\Vendor\Psr\Container\ContainerInterface; use ReflectionClass; use ReflectionException; use ReflectionFunction; use ReflectionMethod;
class ReflectionContainer implements ArgumentResolverInterface, ContainerInterface { use ArgumentResolverTrait; use ContainerAwareTrait;
/** * @var boolean */ protected $cacheResolutions = false;
/** * Cache of resolutions. * * @var array */ protected $cache = [];
/** * {@inheritdoc} * * @throws ReflectionException */ public function get($id, array $args = []) { if ($this->cacheResolutions === true && array_key_exists($id, $this->cache)) { return $this->cache[$id]; }
if (! $this->has($id)) { throw new NotFoundException( sprintf('Alias (%s) is not an existing class and therefore cannot be resolved', $id) ); }
$reflector = new ReflectionClass($id); $construct = $reflector->getConstructor();
$resolution = $construct === null ? new $id : $resolution = $reflector->newInstanceArgs($this->reflectArguments($construct, $args)) ;
if ($this->cacheResolutions === true) { $this->cache[$id] = $resolution; }
return $resolution; }
/** * {@inheritdoc} */ public function has($id) : bool { return class_exists($id); }
/** * Invoke a callable via the container. * * @param callable $callable * @param array $args * * @return mixed * * @throws ReflectionException */ public function call(callable $callable, array $args = []) { if (is_string($callable) && strpos($callable, '::') !== false) { $callable = explode('::', $callable); }
if (is_array($callable)) { if (is_string($callable[0])) { $callable[0] = $this->getContainer()->get($callable[0]); }
$reflection = new ReflectionMethod($callable[0], $callable[1]);
if ($reflection->isStatic()) { $callable[0] = null; }
return $reflection->invokeArgs($callable[0], $this->reflectArguments($reflection, $args)); }
if (is_object($callable)) { $reflection = new ReflectionMethod($callable, '__invoke');
return $reflection->invokeArgs($callable, $this->reflectArguments($reflection, $args)); }
$reflection = new ReflectionFunction(\Closure::fromCallable($callable));
return $reflection->invokeArgs($this->reflectArguments($reflection, $args)); }
/** * Whether the container should default to caching resolutions and returning * the cache on following calls. * * @param boolean $option * * @return self */ public function cacheResolutions(bool $option = true) : ContainerInterface { $this->cacheResolutions = $option;
return $this; } }
|