示例#1
0
 public function compile(Compiler $compiler, OperatorNode $node)
 {
     $left = $node->getChild(OperatorNode::OPERAND_LEFT);
     $keys = [$node->getChild(OperatorNode::OPERAND_RIGHT)];
     while ($this->isPropertyAccessOperator($left)) {
         /** @var $left OperatorNode */
         $keys[] = $left->getChild(OperatorNode::OPERAND_RIGHT);
         $left = $left->getChild(OperatorNode::OPERAND_LEFT);
     }
     $arguments = [$left, array_reverse($keys)];
     if ($node->hasChild(OperatorNode::OPERAND_MIDDLE)) {
         $arguments[] = $node->getChild(OperatorNode::OPERAND_MIDDLE);
     }
     $compiler->add('$context->' . $this->getMethodName($node))->compileArgumentList($arguments);
 }
示例#2
0
 public function compile(Compiler $compiler, OperatorNode $node)
 {
     $left = $node->getChild(OperatorNode::OPERAND_LEFT);
     $compiler->add('(');
     if ($this->isPropertyAccessOperator($left)) {
         $root = $left;
         while ($this->isPropertyAccessOperator($root)) {
             $root = $root->getChild(OperatorNode::OPERAND_LEFT);
         }
         if ($root instanceof VariableNode) {
             $compiler->add('isset(')->compileNode($root)->add(') &&');
         }
         $left->addData('mode', 'has');
         $left->compile($compiler);
         $compiler->add(' && ');
         $left->addData('mode', 'get');
         $left->compile($compiler);
     } elseif ($left instanceof VariableNode) {
         $compiler->add('isset(')->compileNode($left)->add(') && ')->compileNode($left);
     } elseif ($left instanceof ArrayIndexNode) {
         $variable = $left->getChild('identifier');
         $keys = [$left->getChild('key')];
         while ($variable instanceof ArrayIndexNode) {
             /** @var $right OperatorNode */
             $keys[] = $variable->getChild('key');
             $variable = $variable->getChild('identifier');
         }
         $arguments = [$variable, array_reverse($keys)];
         $compiler->add('isset(')->compileNode($variable)->add(') && $context->hasProperty')->compileArgumentList($arguments)->add(' && $context->getProperty')->compileArgumentList($arguments);
     } else {
         $compiler->compileNode($left);
     }
     $compiler->add(') ? (');
     if ($node->hasChild(OperatorNode::OPERAND_MIDDLE)) {
         $compiler->compileNode($node->getChild(OperatorNode::OPERAND_MIDDLE));
     } else {
         $compiler->compileNode($node->getChild(OperatorNode::OPERAND_LEFT));
     }
     $compiler->add(') : (')->compileNode($node->getChild(OperatorNode::OPERAND_RIGHT))->add(')');
 }