function ConstExprEvaluator::evaluateBinaryOp
Return value
mixed
1 call to ConstExprEvaluator::evaluateBinaryOp()
- ConstExprEvaluator::evaluate in vendor/
nikic/ php-parser/ lib/ PhpParser/ ConstExprEvaluator.php
File
-
vendor/
nikic/ php-parser/ lib/ PhpParser/ ConstExprEvaluator.php, line 177
Class
- ConstExprEvaluator
- Evaluates constant expressions.
Namespace
PhpParserCode
private function evaluateBinaryOp(Expr\BinaryOp $expr) {
if ($expr instanceof Expr\BinaryOp\Coalesce && $expr->left instanceof Expr\ArrayDimFetch) {
// This needs to be special cased to respect BP_VAR_IS fetch semantics
return $this->evaluate($expr->left->var)[$this->evaluate($expr->left->dim)] ?? $this->evaluate($expr->right);
}
// The evaluate() calls are repeated in each branch, because some of the operators are
// short-circuiting and evaluating the RHS in advance may be illegal in that case
$l = $expr->left;
$r = $expr->right;
switch ($expr->getOperatorSigil()) {
case '&':
return $this->evaluate($l) & $this->evaluate($r);
case '|':
return $this->evaluate($l) | $this->evaluate($r);
case '^':
return $this->evaluate($l) ^ $this->evaluate($r);
case '&&':
return $this->evaluate($l) && $this->evaluate($r);
case '||':
return $this->evaluate($l) || $this->evaluate($r);
case '??':
return $this->evaluate($l) ?? $this->evaluate($r);
case '.':
return $this->evaluate($l) . $this->evaluate($r);
case '/':
return $this->evaluate($l) / $this->evaluate($r);
case '==':
return $this->evaluate($l) == $this->evaluate($r);
case '>':
return $this->evaluate($l) > $this->evaluate($r);
case '>=':
return $this->evaluate($l) >= $this->evaluate($r);
case '===':
return $this->evaluate($l) === $this->evaluate($r);
case 'and':
return $this->evaluate($l) and $this->evaluate($r);
case 'or':
return $this->evaluate($l) or $this->evaluate($r);
case 'xor':
return $this->evaluate($l) xor $this->evaluate($r);
case '-':
return $this->evaluate($l) - $this->evaluate($r);
case '%':
return $this->evaluate($l) % $this->evaluate($r);
case '*':
return $this->evaluate($l) * $this->evaluate($r);
case '!=':
return $this->evaluate($l) != $this->evaluate($r);
case '!==':
return $this->evaluate($l) !== $this->evaluate($r);
case '+':
return $this->evaluate($l) + $this->evaluate($r);
case '**':
return $this->evaluate($l) ** $this->evaluate($r);
case '<<':
return $this->evaluate($l) << $this->evaluate($r);
case '>>':
return $this->evaluate($l) >> $this->evaluate($r);
case '<':
return $this->evaluate($l) < $this->evaluate($r);
case '<=':
return $this->evaluate($l) <= $this->evaluate($r);
case '<=>':
return $this->evaluate($l) <=> $this->evaluate($r);
}
throw new \Exception('Should not happen');
}