İş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.
İşleçler eşit önceliğe sahip olduklarında aralarındaki ilişkiye işleçlerin gruplanışına göre karar verilir. Örneğin "-" isoldan ilişkilendirmelidir, dolayısıyla, 1 - 2 - 3 ifadesi (1 - 2) - 3 olarak gruplanır ve -4 olarak değerlendirlir. "=" ise sağdan ilişkilendirmelidir, dolayısıyla, $a = $b = $c ifadesi $a = ($b = $c) olarak gruplanır. Özetle, soldan ilişkilendirme, ifadenin soldan sağa, sağdan ilişkilendirme ise sağdan sola değerlendirileceği anlamına gelir.
İlişkisel olmayan eş öncelikli işleçler birbirlerinin ardından kullanılamazlar, örneğin 1 < 2 > 1 ifadesi PHP için uygun değilken 1 <= 1 == 1 ifadesi uygundur. Sebebi == işlecinin <= işlecinden daha az öncelikli olmasıdır.
Parantez kullanımı gerekli olmasa bile çoğunlukla kodun okunabilirliğini arttırır. Örtük işleç önceliğine ve ilişkiselliğine güvenmektense kodu açıkça gruplamak daha iyidir.
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() |
right | ** | aritmetik |
sağdan | ++ -- ~ (int) (float) (string) (array) (object) (bool) @ | türler ve arttırım/eksiltim |
yönsüz | instanceof | Türler |
sağdan | ! | mantıksal |
soldan | * / % | aritmetik |
soldan | + - . | aritmetik ve dize |
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 |
right | ?? | karşılaştırma |
soldan | ? : | üç terimli |
sağdan | = += -= *= **= /= .= %= &= |= ^= <<= >>= | atama |
soldan | and | mantıksal |
soldan | xor | mantıksal |
soldan | or | mantıksal |
Örnek 1 - Öncelik yönü
<?php
$a = 3 * 3 % 5; // (3 * 3) % 5 = 4
// üç terimli işlecin değerlendirilmesi C/C++ dillerinden farklıdır
$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
?>
İşleç önceliklerini ve işlem yönünü ifadeni gruplanışı belirler. PHP (genelde) ifadenin hangi sırayla değerlendirileceğini belirmez ve kodlamada özel bir değerlendirme sırası kabulünden kaçınılmalıdır. Çünkü davranış PHP'nin sürümleri arasında farklı olabildiği gibi sarmalayan koda bağlı olarak da değişebilir.
Örnek 2 - Tanımsız değerlendirme sırası
<?php
$a = 1;
echo $a + $a++; // 2 veya 3 basabilir
$i = 1;
$array[$i] = $i++; // indis 1 veya 2 olabilir
?>
Örnek 3 +, - ve . aynı önceliğe sahiptir
<?php
$x = 4;
// bu satır beklenmedik bir çıktı ile sonuçlanabilir:
echo "x eksi bir eşittir " . $x-1 . ", ya da ben öyle umdum\n";
// çünkü aşağıdaki satır gibi değerlendirilir:
echo (("x eksi bir eşittir " . $x) - 1) . ", ya da ben öyle umdum\n";
// istenen öncelik parantez kullanarak elde edilebilir:
echo "x eksi bir eşittir " . ($x-1) . ", ya da ben öyle umdum\n";
?>
Yukarıdaki örneğin çıktısı:
-1, ya da ben öyle umdum -1, ya da ben öyle umdum x eksi bir eşittir 3, ya da ben öyle umdum
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.