Karşılaştırma işleçleri isminden de anlaşılacağı üzere iki değerin karşılaştırılmasını sağlarlar. Çeşitli veri türleri arasındaki karşılaştırma örneklerinin yer aldığı tür karşılaştırma tabloları ilginizi çekebilir.
Örnek | İsim | Sonuç |
---|---|---|
$a == $b
|
Eşittir | $a ve $b aynı değere sahipse sonuç TRUE olur. |
$a === $b
|
Aynıdır | $a ve $b aynı değere sahipse ve türleri de aynıysa sonuç TRUE olur. (PHP 4'ten beri vardır.) |
$a != $b
|
Eşit değildir | $a ve $b aynı değere sahip değilse sonuç TRUE olur. |
$a <> $b
|
Eşit değildir | $a ve $b aynı değere sahip değilse sonuç TRUE olur. |
$a !== $b
|
Farklıdır | $a ve $b aynı değere sahip değilse veya türleri aynı değilse sonuç TRUE olur. (PHP 4'ten beri vardır.) |
$a < $b
|
Küçüktür | $a kesin olarak $b'den küçükse sonuç TRUE olur. |
$a > $b
|
Büyüktür | $a kesin olarak $b'den büyükse sonuç TRUE olur. |
$a <= $b
|
Küçük veya eşittir | $a, $b'den küçük veya ona eşitse sonuç TRUE olur. |
$a >= $b
|
Büyük veya eşittir | $a, $b'den büyük veya ona eşitse sonuç TRUE olur. |
Bir tamsayıyı bir dizge ile karşılaştırmak isterseniz dizge önce bir sayıya dönüştürülür. İki sayısal dizge tamsayı karşılaştırması olarak ele alınır. Bu kurallar ayrıca switch deyimine de uygulanır.
<?php
var_dump(0 == "a"); // 0 == 0 -> doğru
var_dump("1" == "01"); // 1 == 1 -> doğru
var_dump("1" == "1e0"); // 1 == 1 -> doğru
switch ("a") {
case 0:
echo "0";
break;
case "a": // burası hiç işlem görmez, çünkü "a" daima 0 ile eşleşir
echo "a";
break;
}
?>
Çeşitli türler arasında karşılaştırma aşağıdaki tabloya ve tablodaki sıralamaya uygun olarak yapılır.
1. Terimin Türü | 2. Terimin Türü | Sonuç |
---|---|---|
null veya string | string | NULL, "" dizgesine dönüştürülür, sayısal veya alfabetik karşılaştırma yapılır. |
bool veya null | herhangi bir tür | bool türüne dönüşümden sonra FALSE < TRUE karşılaştırması yapılır |
object | object | Yerleşik sınıflar kendi karşılaştırmalarını tanımlayabilir. Farklı sınıflar karşılaştırılamazlar. Aynı sınıfın özellikleri dizilerdeki gibi (PHP 4) karşılaştırırılır. PHP 5'in uygulaması farklıdır. |
string, resource veya number | string, resource veya number | Diziler ve özkaynaklar sayılara dönüştürülür, sayısal karşılaştırma yapılır. |
array | array | Daha az üyeye sahip dizi diğerinden küçüktür. Eğer 1. terimin anahtarı 2. terimde yoksa diziler karşılaştırılamaz. Karşılaştırma daima değerler karşılaştırılarak yapılır (aşağıdaki örneğe bakınız). |
array | herhangi bir tür | array daima büyüktür. |
object | herhangi bir tür | object daima büyüktür |
Örnek 1 - Özetle Standard Dizi Karşılaştırması
<?php
// Diziler bunun gibi standart karşılaştırma işleçleri ile karşılaştırılır
function standard_dizi_karşılaştır($trm1, $trm2)
{
if (count($ter1) < count($ter2)) {
return -1; // $ter1 < $ter2
} elseif (count($op1) > count($op2)) {
return 1; // $ter1 > $ter2
}
foreach ($ter1 as $anh => $değ) {
if (!array_key_exists($anh, $ter2)) {
return null; // karşılaştırılamaz
} elseif ($değ < $ter2[$anh]) {
return -1;
} elseif ($değ > $ter2[$anh]) {
return 1;
}
}
return 0; // $ter1 == $ter2
}
?>
Ayrıca, strcasecmp(), strcmp() işlevlerine, Dizi işleçlerine ve Türler bölümüne de bakınız.
Diğer bir karşılaştırma işleci ?: (üç terimli) işlecidir.
Örnek 2 - Öntanımlı bir değer atama
<?php
// Üç terimli işleç için kullanım örneği
$action = (empty($_POST['action'])) ? 'default' : $_POST['action'];
// Yukarıdaki kod ile buradaki if/else deyimi aynı işlemi yapar.
if (empty($_POST['action'])) {
$action = 'default';
} else {
$action = $_POST['action'];
}
?>
(ifade1) ? (ifade2) : (ifade3) ifadesinin sonucu, ifade1 doğruysa ifade2 değilse ifade3'dir.
PHP 5.3'ten itibaren üç terimli işlecin orta parçasını dışarda bırakmak mümkündür. ifade1 ?: ifade3 ifadesinin sonucu ifade1 TRUE ise ifade1 ile değilse ifade3'tür.
Bilginize: Üç terimli işleç aslında bir deyimdir, dolayısıyla sonucu bir değişkene atanamaz. Bir değişkeni gönderimli döndürmek istediğiniz takdirde bu önem kazanır. Gönderimli olarak değer döndüren bir işlevde return $var == 42 ? $a : $b; deyimi bu bakımdan çalışmaz ve güncel PHP sürümlerinde bir uyarı gösterilir.
Bilginize: Üç terimli işleçleri iç içe kullanmanız önerilmez. PHP'nin böyle bir işlemin tek bir deyimde yapılmak istenmesi durumundaki davranışı beklendiği gibi olmayabilir.
Örnek 3 - İç içe üç terimli davranışı
<?php
// ilk bakışta aşağıdaki deyimin sonucu 'true' olacak sanılır.
echo (true?'true':false?'t':'f');
// ancak gerçekte çıktı 't' olur.
// Çünkü üç terimli ifade soldan sağa değerlendirilir.
// Aynı deyimi şöyle yazarsanız, durum anlaşılır hale gelir
echo ((true ? 'true' : 'false') ? 't' : 'f');
// Burada, ilk ifade mantıksal olarak doğru olduğundan sonuç 'true'
// olacak, böylece ikinci üç terimlinin ilk terimi 'true' olacak ve
// ikinci üç terimliden 't' dönecektir.
?>