Subversion-Projekte lars-tiefland.laravel_shop

Revision

Details | Letzte Änderung | Log anzeigen | RSS feed

Revision Autor Zeilennr. Zeile
148 lars 1
<?php
2
 
3
/*
4
 * This file is part of the Symfony package.
5
 *
6
 * (c) Fabien Potencier <fabien@symfony.com>
7
 *
8
 * For the full copyright and license information, please view the LICENSE
9
 * file that was distributed with this source code.
10
 */
11
 
12
namespace Symfony\Component\VarDumper\Caster;
13
 
14
use Symfony\Component\VarDumper\Cloner\Stub;
15
 
16
/**
17
 * Represents a list of function arguments.
18
 *
19
 * @author Nicolas Grekas <p@tchwork.com>
20
 */
21
class ArgsStub extends EnumStub
22
{
23
    private static array $parameters = [];
24
 
25
    public function __construct(array $args, string $function, ?string $class)
26
    {
27
        [$variadic, $params] = self::getParameters($function, $class);
28
 
29
        $values = [];
30
        foreach ($args as $k => $v) {
31
            $values[$k] = !\is_scalar($v) && !$v instanceof Stub ? new CutStub($v) : $v;
32
        }
33
        if (null === $params) {
34
            parent::__construct($values, false);
35
 
36
            return;
37
        }
38
        if (\count($values) < \count($params)) {
39
            $params = \array_slice($params, 0, \count($values));
40
        } elseif (\count($values) > \count($params)) {
41
            $values[] = new EnumStub(array_splice($values, \count($params)), false);
42
            $params[] = $variadic;
43
        }
44
        if (['...'] === $params) {
45
            $this->dumpKeys = false;
46
            $this->value = $values[0]->value;
47
        } else {
48
            $this->value = array_combine($params, $values);
49
        }
50
    }
51
 
52
    private static function getParameters(string $function, ?string $class): array
53
    {
54
        if (isset(self::$parameters[$k = $class.'::'.$function])) {
55
            return self::$parameters[$k];
56
        }
57
 
58
        try {
59
            $r = null !== $class ? new \ReflectionMethod($class, $function) : new \ReflectionFunction($function);
60
        } catch (\ReflectionException) {
61
            return [null, null];
62
        }
63
 
64
        $variadic = '...';
65
        $params = [];
66
        foreach ($r->getParameters() as $v) {
67
            $k = '$'.$v->name;
68
            if ($v->isPassedByReference()) {
69
                $k = '&'.$k;
70
            }
71
            if ($v->isVariadic()) {
72
                $variadic .= $k;
73
            } else {
74
                $params[] = $k;
75
            }
76
        }
77
 
78
        return self::$parameters[$k] = [$variadic, $params];
79
    }
80
}