Сравнителните оператори, както подсказва и името им, ви позволяват да сравнявате две стойности. Вероятно бихте били заинтересувани да видите и таблицата със сравнение на типовете, тъй като там има примери със сравнения, свързани с типовете.
Пример | Наименование | Резултат |
---|---|---|
$a == $b | Равно | TRUE ако $a е равна на $b. |
$a === $b | Идентично | TRUE ако $a е равна на $b и ако са от един и също тип. (въведено в PHP 4) |
$a != $b | Не-равно | TRUE ако $a не е равна на $b. |
$a <> $b | Не-равно | TRUE ако $a не е равна на $b. |
$a !== $b | Не-идентично | TRUE ако $a не е равна на $b или ако не са от един и същи тип. (въведено в PHP 4) |
$a < $b | По-малко | TRUE ако $a е строго по-малка от $b. |
$a > $b | По-голямо | TRUE ако $a е строго по-голяма от $b. |
$a <= $b | По-малко или равно | TRUE ако $a е по-малка или равна на $b. |
$a >= $b | По-голямо или равно | TRUE ако $a е по-голяма или равна на $b. |
В случай, че сравнявате цяло число с низ, низът бива преобразуван в число. Ако пък сравнявате два цифрови низа, те биват сравнявани като цели числа. Тези правила са в сила също и за инструкцията switch.
<?php
var_dump(0 == "a"); // 0 == 0 -> true
var_dump("1" == "01"); // 1 == 1 -> true
var_dump("1" == "1e0"); // 1 == 1 -> true
switch ("a") {
case 0:
echo "0";
break;
case "a": // никога не се достига, тъй като "a" вече е съвпаднала с 0
echo "a";
break;
}
?>
За различните типове сравнението се извършва съгласно следната таблица (по ред).
Тип на Операнд 1 | Тип на Операнд 2 | Резултат |
---|---|---|
null или string | string | Преобразува NULL в "", цифрово или лексикално сравнение |
bool или null | всякакъв | Преобразува до bool, FALSE < TRUE |
object | object | Вградените класове могат да дефинират техни собствени сравнения, различните класове са несравними, еднаквите класове - сравняват свойствата по същия начин както масивите (PHP 4), PHP 5 има свое собствено обяснение |
string, resource или number | string, resource или number | Преобразува низовете и ресурсите до числа, обикновена математика |
array | array | Масив с по-малко елементи е по-малък, ако даден ключ от първия операнд не бъде намерен във втория, тогава масивите са несравними, иначе - сравнява стойност по стойност (по-долния пример) |
array | всякакъв | Масивът винаги е по-голям |
object | всякакъв | Обектът винаги е по-голям |
Example #1 Транскрипция на стандартното сравнение на масиви
<?php
// Масивите биват сравнявани посредством стандартни оператори за сравнение, по следния начин
function standard_array_compare($op1, $op2)
{
if (count($op1) < count($op2)) {
return -1; // $op1 < $op2
} elseif (count($op1) > count($op2)) {
return 1; // $op1 > $op2
}
foreach ($op1 as $key => $val) {
if (!array_key_exists($key, $op2)) {
return null; // несравняемо
} elseif ($val < $op2[$key]) {
return -1;
} elseif ($val > $op2[$key]) {
return 1;
}
}
return 0; // $op1 == $op2
}
?>
Вж. също strcasecmp(), strcmp(), Оператори за масиви и разделът от ръководството за Типове.
Друг условен оператор е "?:" (или третичния) оператор.
Example #2 Присвояване на стойност по подразбиране
<?php
// Примерна употреба на: Третичен Оператор
$action = (empty($_POST['action'])) ? 'default' : $_POST['action'];
// Горното е идентично на тази if/else конструкция
if (empty($_POST['action'])) {
$action = 'default';
} else {
$action = $_POST['action'];
}
?>
Изразът (expr1) ? (expr2) : (expr3) се изчислява на expr2 ако expr1 се изчисли на TRUE, и на expr3 в случай, че expr1 се изчисли на FALSE.
От PHP 5.3 нататък е възможно да пропуснете средната част на третичния оператор. Изразът expr1 ?: expr3 връща expr1 ако expr1 се изчисли на TRUE, и expr3 - иначе.
Забележка: Забележете, че третичният оператор е израз, и че той не се изчислява до променлива, а до резултата на израза. Това е важно да се знае, когато искате да върнете променлива по референция. Затова изразът return $var == 42 ? $a : $b; във функция, която връща по референция няма да работи и в по-късни версии на PHP ще бъде изведено предупреждение.
Забележка: Препоръчително е да избягвате "натрупването" на третични изрази. Поведението на PHP при използване на повече от един третичен оператор в рамките на един израз не е очевиден:
Example #3 Неясно третично поведение
<?php
// на пръв поглед, следното изглежда, че извежда 'true'
echo (true?'true':false?'t':'f');
// действителният изход, обаче, е 't'
// това е така, понеже третичните изрази се изчисляват от ляво на дясно
// следното е по-ясен вариант на същия код
echo ((true ? 'true' : 'false') ? 't' : 'f');
// в този случай може да видите, че първият израз се изчислява на 'true', което
// от своя страна се изчислява на (bool)true и така се връща истинното разклонение на
// втория третичен израз.
?>