( - the function call operator - has higher precedence than ++ and --, but lower precedence than [.
Therefore you can do the following:
<?php
$func[0] = 'exit';
$func[0]();
?>
But the following will cause a syntax error:
<?php
function func() {
return array('string');
}
func()[0];
?>
Precedencia de operadores
La precedencia de un operador indica qué tan "estrechamente" se unen dos expresiones juntas. Por ejemplo, en la expresión 1 + 5 * 3 , la respuesta es 16 y no 18 porque el operador de multiplicación ("*") tiene una precedencia mayor que el operador de adición ("+"). Los paréntesis pueden ser usados para forzar la precedencia, si es necesario. Por ejemplo: (1 + 5) * 3 se evalúa como 18.
Cuando los operadores tienen la misma precedencia, su asociatividad decide si se evalúan a partir de la derecha o desde la izquierda - ver más abajo los ejemplos.
La siguiente tabla lista en orden la precedencia de los operadores, con los operadores de mayor precedencia en la parte superior. Los operadores en la misma línea tienen la misma precedencia, en cuyo caso su asociatividad decide cuál es el orden de evaluación.
| Asociatividad | Operadores | Información adicional |
|---|---|---|
| no asociativo | clone new | clone and new |
| izquierda | [ | array() |
| no asociativo | ++ -- | incremento/decremento |
| derecha | ~ - (int) (float) (string) (array) (object) (bool) @ | tipos |
| no asociativo | instanceof | tipos |
| derecha | ! | lógico |
| izquierda | * / % | aritmética |
| izquierda | + - . | aritmética y string |
| izquierda | << >> | bit a bit |
| no asociativo | < <= > >= <> | comparación |
| no asociativo | == != === !== | comparación |
| izquierda | & | bit a bit y referencias |
| izquierda | ^ | bit a bit |
| izquierda | | | bit a bit |
| izquierda | && | lógico |
| izquierda | || | lógico |
| izquierda | ? : | ternario |
| derecha | = += -= *= /= .= %= &= |= ^= <<= >>= => | asignación |
| izquierda | and | lógico |
| izquierda | xor | lógico |
| izquierda | or | lógico |
| izquierda | , | muchos usos |
Para operadores de igual precedencia, asociatividad izquierda significa que la evaluación procede de la izquierda a la derecha y asociatividad derecha significa lo opuesto.
Ejemplo #1 Asociatividad
<?php
$a = 3 * 3 % 5; // (3 * 3) % 5 = 4
$a = true ? 0 : true ? 1 : 2; // (true ? 0 : true) ? 1 : 2 = 2
$a = 1;
$b = 2;
$a = $b += 3; // $a = ($b += 3) -> $a = 5, $b = 5
// mezclar ++ y + produce un comportamiento indefinido
$a = 1;
echo ++$a + $a++; // puede mostrar 4 o 5
?>
Nota:
Aunque = tiene una precedencia menor que la mayoría de los demás operadores, PHP permitirá aun expresiones similares a lo siguiente: if (!$a = foo()), en cuyo caso el valor devuelto de foo() es puesto en $a.
Be very careful with the precedence. See this code:
<?php
$a = 1;
$b = null;
$c = isset($a) && isset($b);
$d = ( isset($a) and isset($b) );
$e = isset($a) and isset($b);
var_dump($a, $b, $c, $d, $e);
?>
Result:
int(1)
NULL
bool(false)
bool(false)
bool(true) <==
Be careful of the difference between
<?php
$obj = new class::$staticVariable();
?>
<?php
$value = class::$staticVariable();
?>
In the first case, the object class will depend on the static variable class::$staticVariable, while in the second case it will be invoked the method whose name is contained in the variable $staticVariable.
Although example above already shows it, I'd like to explicitly state that ?: associativity DIFFERS from that of C++. I.e. convenient switch/case-like expressions of the form
$i==1 ? "one" :
$i==2 ? "two" :
$i==3 ? "three" :
"error";
will not work in PHP as expected
You can use the "or" and "and" keywords' lower precedence for a bit of syntax candy:
<?php
$page = (int) @$_GET['page'] or $page = 1;
?>
