İş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.

İş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.

İşleç Öncelikleri
İlişkilendirmeİşleçlerEk bilgi
(yok)clonenewclone 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
soldaninstanceofTü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 fromyield from
(yok)yieldyield
(yok)printprint
soldanandmantıksal
soldanxormantıksal
soldanormantı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 atayan if (!$a = foo()) ifadesi.

Sürüm Bilgisi

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.
To Top