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