Defined.php (1858B)
1 <?php 2 3 /* 4 * This file is part of Twig. 5 * 6 * (c) 2011 Fabien Potencier 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 /** 13 * Checks if a variable is defined in the current context. 14 * 15 * <pre> 16 * {# defined works with variable names and variable attributes #} 17 * {% if foo is defined %} 18 * {# ... #} 19 * {% endif %} 20 * </pre> 21 * 22 * @author Fabien Potencier <fabien@symfony.com> 23 */ 24 class Twig_Node_Expression_Test_Defined extends Twig_Node_Expression_Test 25 { 26 public function __construct(Twig_NodeInterface $node, $name, Twig_NodeInterface $arguments = null, $lineno) 27 { 28 if ($node instanceof Twig_Node_Expression_Name) { 29 $node->setAttribute('is_defined_test', true); 30 } elseif ($node instanceof Twig_Node_Expression_GetAttr) { 31 $node->setAttribute('is_defined_test', true); 32 33 $this->changeIgnoreStrictCheck($node); 34 } elseif ($node instanceof Twig_Node_Expression_Constant || $node instanceof Twig_Node_Expression_Array) { 35 $node = new Twig_Node_Expression_Constant(true, $node->getLine()); 36 } else { 37 throw new Twig_Error_Syntax('The "defined" test only works with simple variables.', $this->getLine()); 38 } 39 40 parent::__construct($node, $name, $arguments, $lineno); 41 } 42 43 protected function changeIgnoreStrictCheck(Twig_Node_Expression_GetAttr $node) 44 { 45 $node->setAttribute('ignore_strict_check', true); 46 47 if ($node->getNode('node') instanceof Twig_Node_Expression_GetAttr) { 48 $this->changeIgnoreStrictCheck($node->getNode('node')); 49 } 50 } 51 52 public function compile(Twig_Compiler $compiler) 53 { 54 $compiler->subcompile($this->getNode('node')); 55 } 56 }