/var/www/html/wp-content/plugins/woocommerce/lib/packages/League/Container/ReflectionContainer.php


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\{ArgumentResolverInterfaceArgumentResolverTrait};
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 ArgumentResolverInterfaceContainerInterface
{
    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;
    }
}