1 | <?php |
||
15 | class ExpressionLanguage extends \Symfony\Component\ExpressionLanguage\ExpressionLanguage { |
||
16 | 86 | public function __construct() { |
|
17 | 86 | parent::__construct(new NullAdapter()); |
|
18 | |||
19 | 86 | $this->registerNodeFunction(GetAttrNode::class, function (\Symfony\Component\ExpressionLanguage\Compiler $compiler, GetAttrNode $node) { |
|
20 | 11 | switch ($node->attributes['type']) { |
|
21 | 11 | case GetAttrNode::METHOD_CALL: |
|
22 | $compiler |
||
23 | ->compile($node->nodes['node']) |
||
24 | ->raw('->') |
||
25 | ->raw($node->nodes['attribute']->attributes['value']) |
||
26 | ->raw('(') |
||
27 | ->compile($node->nodes['arguments']) |
||
28 | ->raw(')') |
||
29 | ; |
||
30 | break; |
||
31 | |||
32 | 11 | case GetAttrNode::PROPERTY_CALL: |
|
33 | 11 | case GetAttrNode::ARRAY_CALL: |
|
34 | 11 | $itExpr = $this->iteratorExpression($node); |
|
35 | |||
36 | 11 | if ($itExpr) { |
|
|
|||
37 | 1 | $compiler->raw($itExpr); |
|
38 | 1 | } else { |
|
39 | $compiler |
||
40 | 10 | ->compile($node->nodes['node']) |
|
41 | 10 | ->raw('[') |
|
42 | 10 | ->compile($node->nodes['attribute'])->raw(']'); |
|
43 | } |
||
44 | 11 | break; |
|
45 | 11 | } |
|
46 | 86 | }); |
|
47 | 86 | } |
|
48 | |||
49 | /** |
||
50 | * Look for a specific iterator expression. |
||
51 | * |
||
52 | * Iterator expressions are one of the following: |
||
53 | * |
||
54 | * - i123.index |
||
55 | * - i123.first |
||
56 | * - i123.last |
||
57 | * - i123.count |
||
58 | * |
||
59 | * @param GetAttrNode $node The node to inspect. |
||
60 | * @return null|string Returns the appropriate variable or **null** if the node isn't an iterator expression. |
||
61 | */ |
||
62 | 11 | private function iteratorExpression(GetAttrNode $node) { |
|
63 | 11 | if (empty($node->nodes['node']) |
|
64 | 11 | || !($node->nodes['node'] instanceof NameNode) |
|
65 | 11 | || !preg_match('`^i(\d+)$`', $node->nodes['node']->attributes['name'], $m) |
|
66 | 11 | || empty($node->nodes['attribute']) |
|
67 | 1 | || !($node->nodes['attribute'] instanceof ConstantNode) |
|
68 | 1 | || !in_array($node->nodes['attribute']->attributes['value'], ['index', 'first', 'last', 'count'], true) |
|
69 | 11 | ) { |
|
70 | |||
71 | 10 | return null; |
|
72 | } |
||
73 | 1 | $i = $m[1]; |
|
74 | 1 | $field = $node->nodes['attribute']->attributes['value']; |
|
75 | 1 | return "\${$field}{$i}"; |
|
76 | } |
||
77 | |||
78 | 41 | public function getFunctionCompiler($name) { |
|
84 | } |
||
85 |
In PHP, under loose comparison (like
==
, or!=
, orswitch
conditions), values of different types might be equal.For
string
values, the empty string''
is a special case, in particular the following results might be unexpected: