( - 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];
?>
İşleç Önceliği
İşleç önceliği iki ifadenin birbirine hangi sıkılıkta bağlı olduğunu belirtir. Örneğin, 1 + 5 * 3 ifadesinin sonucu 18 değil, 16'dır. Çünkü, çarpma ("*") işlecinin önceliği toplama ("+") işlecinden yüksektir. Önceliği arttırmak için gerekirse parantezler kullanılabilir. Örneğin, (1 + 5) * 3 ifadesinin sonucu 18 olacaktır. Eğer işleç önceliklerinde eşitlik sözkonusu olursa soldaki işleç sağdakinden öncelikli olur.
Aşağıdaki listede işleçler en yüksek öncelikliden başlayıp en düşük öncelikliye doğru sıralanmışlardır. Aynı satırda yer alan işleçler eşöncelikli olup hangi sırada ele alınacaklarına değerlendirme sırasında karar verilir.
| İlişkilendirme | İşleçler | Ek bilgi |
|---|---|---|
| yönsüz | clone new |
clone ve new |
| soldan | [ |
array() |
| yönsüz | ++ -- |
arttırım/eksiltim |
| sağdan | ~ - (int) (float) (string) (array) (object)
(bool) @ |
Türler |
| yönsüz | instanceof |
Türler |
| sağdan | ! |
mantıksal |
| soldan | * / % |
aritmetik |
| soldan | + - . |
aritmetik ve dizge |
| soldan | << >> |
bitsel |
| yönsüz | < <= > >= <> |
karşılaştırma |
| yönsüz | == != === !== |
karşılaştırma |
| left | & |
bitsel ve gönderimler |
| soldan | ^ |
bitsel |
| soldan | | |
bitsel |
| soldan | && |
mantıksal |
| soldan | || |
mantıksal |
| soldan | ? : |
üç terimli |
| sağdan |
= += -= *= /= .= %= &= |= ^= <<= >>= =>
|
atama |
| soldan | and |
mantıksal |
| soldan | xor |
mantıksal |
| soldan | or |
mantıksal |
| soldan | , |
birçok kullanım |
Soldan ilişkilendirme, ifadenin soldan sağa, sağdan ilişkilendirme ise sağdan sola değerlendirileceği anlamına gelir.
Örnek 1 - Öncelik yönü
<?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
?>
Bilginize:
Eşitlik (=) işleci çoğu işleçten daha düşük önceliğe sahip olduğundan PHP halen şuna benzer ifadelere izin vermektedir: foo() işlevinin dönüş değerini $a değişkenine atayan if (!$a = foo()) ifadesi.
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;
?>
