These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more
1 | <?php |
||
2 | |||
3 | namespace steevanb\PhpYaml; |
||
4 | |||
5 | use steevanb\PhpYaml\Exception\FunctionIdNotFoundException; |
||
6 | use steevanb\PhpYaml\Exception\FunctionNotFoundException; |
||
7 | use Symfony\Component\Yaml\Parser as SymfonyYamlParser; |
||
8 | |||
9 | class Parser extends SymfonyYamlParser |
||
10 | { |
||
11 | /** @var array */ |
||
12 | protected static $functions = []; |
||
13 | |||
14 | /** |
||
15 | * @param string $id |
||
16 | * @param callable $callable |
||
17 | */ |
||
18 | public static function registerFunction($id, $callable) |
||
19 | { |
||
20 | static::$functions[$id] = $callable; |
||
21 | } |
||
22 | |||
23 | /** @param string|null $path */ |
||
24 | public static function registerFileFunction($path = null) |
||
25 | { |
||
26 | static::registerFunction('file', function($fileName) use ($path) { |
||
27 | $path = $path === null ? __DIR__ : rtrim($path, DIRECTORY_SEPARATOR); |
||
0 ignored issues
–
show
|
|||
28 | $filePath = $fileName[0] === DIRECTORY_SEPARATOR ? $fileName : $path . DIRECTORY_SEPARATOR . $fileName; |
||
29 | if (is_readable($filePath) === false) { |
||
30 | throw new \Exception('File "' . $filePath . '" not found.'); |
||
31 | } |
||
32 | |||
33 | return file_get_contents($filePath); |
||
34 | }); |
||
35 | } |
||
36 | |||
37 | public static function registerDateFunction() |
||
38 | { |
||
39 | static::registerFunction('date', function($date = null) { |
||
40 | return new \DateTime($date); |
||
41 | }); |
||
42 | } |
||
43 | |||
44 | /** |
||
45 | * @param string $value |
||
46 | * @param int $flags |
||
47 | * @return array|null |
||
48 | */ |
||
49 | public function parse($value, $flags = 0) |
||
50 | { |
||
51 | $return = parent::parse($value, $flags); |
||
52 | |||
53 | if (is_array($return)) { |
||
54 | $this->parseValues($return); |
||
55 | } |
||
56 | |||
57 | return $return; |
||
58 | } |
||
59 | |||
60 | /** |
||
61 | * @param array $values |
||
62 | * @return $this |
||
63 | * @throws \Exception |
||
64 | */ |
||
65 | protected function parseValues(array &$values) |
||
66 | { |
||
67 | foreach ($values as &$value) { |
||
68 | if (is_array($value)) { |
||
69 | $this->parseValues($value); |
||
70 | } elseif (is_string($value) && substr($value, 0, 1) === '<' && substr($value, -1) === '>') { |
||
71 | $functionId = null; |
||
72 | $parameters = []; |
||
73 | foreach (token_get_all('<?php ' . $value) as $token) { |
||
74 | if (is_array($token)) { |
||
75 | if ($token[0] === T_STRING && $functionId === null) { |
||
76 | $functionId = $token[1]; |
||
77 | } elseif ($token[0] === T_STRING) { |
||
78 | $parameters[] = $token[1]; |
||
79 | } elseif ($token[0] === T_CONSTANT_ENCAPSED_STRING) { |
||
80 | $parameters[] = substr($token[1], 1, -1); |
||
81 | } elseif ($token[0] === T_LNUMBER || $token[0] === T_DNUMBER) { |
||
82 | $parameters[] = $token[1]; |
||
83 | } |
||
84 | } |
||
85 | } |
||
86 | |||
87 | if ($functionId === null) { |
||
88 | throw new FunctionIdNotFoundException('Function name cannont be found in ' . $value . '.'); |
||
89 | } elseif (isset(static::$functions[$functionId]) === false) { |
||
90 | throw new FunctionNotFoundException('Function "' . $functionId . '" not found.'); |
||
91 | } |
||
92 | |||
93 | $value = call_user_func_array(static::$functions[$functionId], $parameters); |
||
94 | } |
||
95 | } |
||
96 | |||
97 | return $this; |
||
98 | } |
||
99 | } |
||
100 |
It seems like you are assigning to a variable which was imported through a
use
statement which was not imported by reference.For clarity, we suggest to use a different name or import by reference depending on whether you would like to have the change visibile in outer-scope.
Change not visible in outer-scope
Change visible in outer-scope