Operatorlar — arifmetik, == va ===, mantiqiy, ??, <=>

~15 daq · PHP · Kirish va Asoslar

Muammodan boshlaylik

Login sahifasi. Foydalanuvchi PIN kod kiritdi: "0". Bazadagi PIN esa — 0 (son). Siz ularni solishtirasiz va... PHP qaysi tekshiruvda "teng" deydi, qaysisida "teng emas"? Bu farqni bilmaslik — haqiqiy xavfsizlik teshiklariga sabab bo'lgan.

Operatorlar — qiymatlar ustida amal bajaruvchi belgilar. Ko'pchiligi matematikadan tanish, lekin bir nechtasi PHP ga xos va juda muhim.


Arifmetik operatorlar

<?php

$a = 17;
$b = 5;

echo $a + $b;    // 22   qo'shish
echo $a - $b;    // 12   ayirish
echo $a * $b;    // 85   ko'paytirish
echo $a / $b;    // 3.4  bo'lish (natija float bo'lishi mumkin)
echo $a % $b;    // 2    qoldiq
echo $a ** 2;    // 289  daraja
echo intdiv($a, $b);  // 3 — butun qismi

% (qoldiq) juda foydali — masalan son juft yoki toqligini aniqlash:

<?php

$son = 7;
echo $son % 2;   // 1 → toq (juft bo'lsa 0)

Nolga bo'lish:

<?php

echo 10 / 0;
// DivisionByZeroError: Division by zero

Matn birlashtirish: .

PHP da + faqat sonlar uchun. Matnlarni birlashtirish — nuqta bilan:

<?php

$ism = "Aziz";
$familiya = "Karimov";

echo $ism . " " . $familiya;   // Aziz Karimov

$xabar = "Salom";
$xabar .= ", dunyo";           // $xabar = $xabar . ", dunyo"
echo $xabar;                   // Salom, dunyo

JavaScript dan kelganlar ko'p xato qiladi:

<?php

echo "Narx: " + 5000;
// TypeError: Unsupported operand types: string + int

Taqqoslash: == va ===

Bu — PHP dagi eng muhim farq.

  • == — qiymat teng (kerak bo'lsa turni o'zgartirib solishtiradi)
  • === — qiymat VA tur teng (hech narsani o'zgartirmaydi)
<?php

var_dump(5 == "5");     // bool(true)  — "5" songa aylantirildi
var_dump(5 === "5");    // bool(false) — int va string, turi boshqa

var_dump(0 == "");      // bool(false) (PHP 8 da)
var_dump(null == false);  // bool(true)
var_dump(null === false); // bool(false)

var_dump("1" == "01");  // bool(true)  — ikkalasi ham son ko'rinishida
var_dump("1" === "01"); // bool(false)

var_dump("abc" == 0);   // bool(false) (PHP 8 da; PHP 7 da true edi!)

Teng emaslik uchun ham ikki variant: != va !==.

[!WARNING] Har doim === va !== ishlating. == faqat aniq sababingiz bo'lganda. == ning g'alati qoidalari ko'p yillar davomida login tekshiruvlarini aylanib o'tish uchun ishlatilgan.


Nima uchun shunday?

Nima uchun PHP da ikki xil tenglik bor?

PHP formadan keladigan ma'lumot bilan ishlash uchun yaratilgan — u yerda hamma narsa matn. $_GET['id'] == 5 yozish qulay bo'lishi uchun == turlarni o'zi moslashtiradi. Lekin bu qulaylik kutilmagan holatlarga olib keldi, shuning uchun qat'iy === qo'shildi. Zamonaviy PHP kodi deyarli faqat === ishlatadi.


Boshqa taqqoslash operatorlari

<?php

$yosh = 20;

var_dump($yosh > 18);    // true   katta
var_dump($yosh < 18);    // false  kichik
var_dump($yosh >= 20);   // true   katta yoki teng
var_dump($yosh <= 19);   // false  kichik yoki teng

Spaceship operatori <=>

Ikki qiymatni solishtirib, uchta natijadan birini beradi:

<?php

echo 5 <=> 10;   // -1  (chap kichik)
echo 10 <=> 10;  //  0  (teng)
echo 15 <=> 10;  //  1  (chap katta)

Bu tartiblashda (sort) juda qulay — massivlar darsida ko'ramiz.


Mantiqiy operatorlar

<?php

$yosh = 20;
$pasport = true;

var_dump($yosh >= 18 && $pasport);   // true  — VA: ikkalasi ham true
var_dump($yosh < 18 || $pasport);    // true  — YOKI: kamida bittasi true
var_dump(!$pasport);                 // false — EMAS: teskarisi

and, or so'zlari ham bor, lekin ularning ustuvorligi (prioriteti) = dan past — bu chalkash xatolarga olib keladi:

<?php

$natija = true and false;
var_dump($natija);   // bool(true) !!! — chunki ($natija = true) and false

Shuning uchun doim && va || ishlating.


Null coalescing: ??

"Agar chapdagi qiymat mavjud va null bo'lmasa — uni ol, aks holda o'ngdagini ol":

<?php

// URL: index.php?sahifa=3
$sahifa = $_GET['sahifa'] ?? 1;
echo $sahifa;   // 3

// URL: index.php
$sahifa = $_GET['sahifa'] ?? 1;
echo $sahifa;   // 1 — xato yo'q, standart qiymat

?? bo'lmasa, mavjud bo'lmagan kalitga murojaat Warning beradi. ?? buni jimgina hal qiladi.

Qisqa ko'rinishi — ??=:

<?php

$sozlamalar['til'] ??= 'uz';   // agar til belgilanmagan bo'lsa — 'uz' qo'y

Increment va decrement

<?php

$i = 5;
echo $i++;   // 5 — avval chiqaradi, keyin oshiradi
echo $i;     // 6

$j = 5;
echo ++$j;   // 6 — avval oshiradi, keyin chiqaradi

Farq faqat ifoda ichida ishlatilganda seziladi. Alohida qatorda yozsangiz ($i++;) — farqi yo'q.


Operatorlar ustuvorligi

Matematikadagi kabi: * va / avval, + va - keyin.

<?php

echo 2 + 3 * 4;     // 14, 20 emas
echo (2 + 3) * 4;   // 20

Qoida: ishonchingiz komil bo'lmasa — qavs qo'ying. Qavs hech qachon zarar qilmaydi, lekin kodni aniqroq qiladi.


Tez-tez uchraydigan xatolar

= va == ni chalkashtirish:

<?php

$rol = "user";
if ($rol = "admin") {      // ❌ bu tekshiruv emas, qiymat berish!
    echo "Xush kelibsiz, admin";   // har doim chiqadi
}

To'g'risi: if ($rol === "admin").

Matnni + bilan birlashtirish — yuqorida ko'rdik, . ishlating.

?? va ?: ni chalkashtirish:

<?php

$miqdor = 0;
echo $miqdor ?? 10;   // 0  — chunki 0 null emas
echo $miqdor ?: 10;   // 10 — chunki 0 "false" hisoblanadi

?? faqat null va mavjud emaslikni tekshiradi. ?: esa har qanday "false" qiymatni.


Xulosa

Eslab qoling:

  • + - * / % ** — arifmetik; . — matn birlashtirish
  • === va !== — har doim shularni ishlating
  • &&, ||, ! — mantiqiy; and/or dan qoching
  • ?? — standart qiymat berishning eng qulay yo'li
  • <=> — uch natijali solishtirish (-1, 0, 1)
  • Shubha bo'lsa — qavs qo'ying

Keyingi dars

7-dars: Stringlar — ' va " farqi, nuqta bilan birlashtirish, heredoc, funksiyalar