Operatorlar — arifmetik, == va ===, mantiqiy, ??, <=>
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/ordan 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