İş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.
İlişkisellik sadece iki terimli (ve üç terimli) işleçler için anlamlıdır. Tek terimli işleçlerin önüne veya ardına ekleme yapıldığından bu fikir tek terimlilere uygulanabilir değildir. Örneğin, !!$a
ifadesi sadece !(!$a)
olarak gruplanabilir.
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 |
---|---|---|
(yok) | clone new | clone ve new |
(yok) | ** | aritmetik |
sağdan | + - ++ -- ~ (int) (float) (string) (array) (object) (bool) @ | aritmetik (tek terimli + ve - ), arttırım/eksiltim, bitsel, tür çarpıtma ve hata denetimi |
soldan | instanceof | Tür |
(yok) | ! | mantıksal |
soldan | * / % | aritmetik |
soldan | + - . | aritmetik (iki terimli + ve - ), dizi ve dize (PHP 8.0.0 öncesinde . ) |
soldan | << >> | bitsel |
soldan | . | dize (PHP 8.0.0 öncesinde . ) |
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 | ?? | null birleşimi |
yönsüz | ? : | üç terimli (PHP 8.0.0 öncesinde soldan) |
sağdan | = += -= *= **= /= .= %= &= |= ^= <<= >>= ??= | atama |
(yok) | yield from | yield from |
(yok) | yield | yield |
(yok) | print | |
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 (PHP 8.0.0 öncesi)
$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 8.0.0 öncesi)
<?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 atayanif (!$a = foo())
ifadesi.
Sürüm: | Açıklama |
---|---|
8.0.0 | Dizelerin ard arda eklenmesi (. ) artık aritmetik toplama ve çıkarma (+ ve - ) ve bitsel sola/sağa kaydırma (<< ve >> ) işleçlerinden daha düşük öncelikli oldu; evvelce + ve - ile aynı önceliğe, << ve >> işleçlerinden daha yüksek önceliğe sahipti. |
8.0.0 | Üç terimli işleç (? : ) artık ilişkisel değil; evvelce soldan ilişkili idi. |
7.4.0 | Dizelerin ard arda eklenmesinin (. ) toplama ve çıkarma (+ ve - ) ve bitsel sola/sağa kaydırma (<< ve >> ) işleçlerine göre önceliğine (yani parantezsiz birlikte kullanımlarına) güvenilmesi artık önerilmiyor. |
7.4.0 | Üç terimli işlecin (? : ) soldan ilişkiselliğine güvenmek artık önerilmiyor; yani, çok sayıda parantezsiz üç terimli artık iç içe yazılmamalıdır. |