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
|
<?php
/* * This file is part of the Symfony package. * * (c) Fabien Potencier <fabien@symfony.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */
namespace Symfony\Component\ExpressionLanguage\Node;
use Symfony\Component\ExpressionLanguage\Compiler;
/** * @author Fabien Potencier <fabien@symfony.com> * * @internal */ class GetAttrNode extends Node { const PROPERTY_CALL = 1; const METHOD_CALL = 2; const ARRAY_CALL = 3;
public function __construct(Node $node, Node $attribute, ArrayNode $arguments, $type) { parent::__construct( array('node' => $node, 'attribute' => $attribute, 'arguments' => $arguments), array('type' => $type) ); }
public function compile(Compiler $compiler) { switch ($this->attributes['type']) { case self::PROPERTY_CALL: $compiler ->compile($this->nodes['node']) ->raw('->') ->raw($this->nodes['attribute']->attributes['value']) ; break;
case self::METHOD_CALL: $compiler ->compile($this->nodes['node']) ->raw('->') ->raw($this->nodes['attribute']->attributes['value']) ->raw('(') ->compile($this->nodes['arguments']) ->raw(')') ; break;
case self::ARRAY_CALL: $compiler ->compile($this->nodes['node']) ->raw('[') ->compile($this->nodes['attribute'])->raw(']') ; break; } }
public function evaluate($functions, $values) { switch ($this->attributes['type']) { case self::PROPERTY_CALL: $obj = $this->nodes['node']->evaluate($functions, $values); if (!\is_object($obj)) { throw new \RuntimeException('Unable to get a property on a non-object.'); }
$property = $this->nodes['attribute']->attributes['value'];
return $obj->$property;
case self::METHOD_CALL: $obj = $this->nodes['node']->evaluate($functions, $values); if (!\is_object($obj)) { throw new \RuntimeException('Unable to get a property on a non-object.'); } if (!\is_callable($toCall = array($obj, $this->nodes['attribute']->attributes['value']))) { throw new \RuntimeException(sprintf('Unable to call method "%s" of object "%s".', $this->nodes['attribute']->attributes['value'], \get_class($obj))); }
return \call_user_func_array($toCall, $this->nodes['arguments']->evaluate($functions, $values));
case self::ARRAY_CALL: $array = $this->nodes['node']->evaluate($functions, $values); if (!\is_array($array) && !$array instanceof \ArrayAccess) { throw new \RuntimeException('Unable to get an item on a non-array.'); }
return $array[$this->nodes['attribute']->evaluate($functions, $values)]; } } }
|