Ma'lumot turlari — int, float, string, bool, null va tur o'zgartirish
Muammodan boshlaylik
Foydalanuvchi formaga yoshini kiritdi: 25. Siz unga 1 qo'shmoqchisiz. Natija 26 bo'ladimi yoki 251? Bu qiymat sonmi yoki matnmi — shunga bog'liq.
Formadan keladigan hamma narsa — matn. Bazadan kelgan narsa — ba'zan son, ba'zan matn. Turlarni tushunmasangiz, bunday chalkashliklar sizni kutilmagan natijalarga olib boradi.
Asosiy turlar
PHP da 4 ta oddiy (skalyar) tur va bitta "bo'sh" tur bor:
| Tur | Nima | Misol |
|---|---|---|
int |
Butun son | 42, -7, 0 |
float |
Kasr son | 3.14, -0.5, 1.0 |
string |
Matn | "Salom", 'abc' |
bool |
Ha / Yo'q | true, false |
null |
Qiymat yo'q | null |
Bundan tashqari murakkab turlar bor: array (massiv), object (ob'ekt) — ularni alohida darslarda o'rganamiz.
int — butun sonlar
<?php
$yosh = 25;
$harorat = -12;
$aholi = 37_000_000; // _ faqat o'qish uchun, PHP uni e'tiborsiz qoldiradi
var_dump($aholi); // int(37000000)
echo PHP_INT_MAX; // 9223372036854775807 — eng katta int (64-bit tizimda)
float — kasr sonlar
<?php
$narx = 19.99;
$foiz = 0.15;
$katta = 1.5e6; // 1.5 × 10⁶ = 1500000
var_dump($katta); // float(1500000)
Muhim tuzoq — kasr sonlar kompyuterda aniq saqlanmaydi:
<?php
var_dump(0.1 + 0.2 == 0.3); // bool(false) !!!
echo 0.1 + 0.2; // 0.3 — lekin ichida 0.30000000000000004
Bu PHP ning xatosi emas — deyarli barcha tillarda shunday (ikkilik sanoq tizimi sababli). Shuning uchun pulni float da saqlamang. Tiyinlarda int sifatida saqlang: 19.99 so'm emas, 1999 tiyin.
string — matn
<?php
$ism = "Dilnoza";
$shahar = 'Samarqand';
$bosh = ""; // bo'sh string — bu ham string
echo strlen($ism); // 7 — uzunligi
" va ' o'rtasida farq bor — bu haqda alohida dars bor (7-dars).
bool — mantiqiy qiymat
Faqat ikkita qiymat: true yoki false.
<?php
$kirganmi = true;
$adminmi = false;
var_dump(10 > 5); // bool(true)
echo bilan chiqarsangiz g'alati natija ko'rasiz:
<?php
echo true; // 1
echo false; // (hech narsa chiqmaydi — bo'sh string)
Shuning uchun bool qiymatlarni tekshirishda var_dump() ishlating.
null — "qiymat yo'q"
null — o'zgaruvchi mavjud, lekin ichida hech narsa yo'q degani.
<?php
$telefon = null; // foydalanuvchi telefon kiritmagan
var_dump($telefon); // NULL
var_dump(is_null($telefon)); // bool(true)
null va 0 va "" — uch xil narsa. 0 — bu son (nol so'm qarzi bor). null — ma'lumot umuman yo'q (qarzi borligi noma'lum).
Turni tekshirish
<?php
$x = "42";
var_dump(is_int($x)); // bool(false) — bu matn!
var_dump(is_string($x)); // bool(true)
var_dump(is_numeric($x)); // bool(true) — son ko'rinishidagi matn
var_dump(is_bool($x)); // bool(false)
var_dump(is_float($x)); // bool(false)
is_numeric() — formadan kelgan qiymat son ekanligini tekshirishda juda foydali.
Avtomatik tur o'zgarishi (type juggling)
PHP kerak bo'lganda turni o'zi o'zgartiradi:
<?php
$a = "10"; // string
$b = 5; // int
var_dump($a + $b); // int(15) — PHP "10" ni songa aylantirdi
var_dump($a . $b); // string(3) "105" — . bu matn birlashtirish, 5 matnga aylandi
Bu qulay, lekin xavfli ham:
<?php
var_dump("5 olma" + 3);
// Warning: A non-numeric value... → int(8)
var_dump("olma" + 3);
// TypeError: Unsupported operand types: string + int
PHP 8 dan boshlab bunday holatlarda ancha qattiqroq — xato beradi. Bu yaxshi: xatoni erta ko'rasiz.
Qo'lda tur o'zgartirish (casting)
Turni aniq o'zgartirish uchun qavs ichida tur nomini yozasiz:
<?php
$yosh = "25";
$son = (int) $yosh; // int(25)
$kasr = (float) "3.14"; // float(3.14)
$matn = (string) 100; // string(3) "100"
$mantiq = (bool) 1; // bool(true)
var_dump((int) "12abc"); // int(12) — boshidagi raqamlarni oladi
var_dump((int) "abc"); // int(0)
var_dump((int) 9.99); // int(9) — yaxlitlamaydi, kesib tashlaydi!
Funksiya ko'rinishida ham bor: intval(), floatval(), strval(), boolval().
Qaysi qiymatlar false hisoblanadi?
Shart ichida (if) PHP har qanday qiymatni bool ga aylantiradi. Quyidagilar false bo'ladi:
<?php
var_dump((bool) false); // false
var_dump((bool) 0); // false
var_dump((bool) 0.0); // false
var_dump((bool) ""); // false
var_dump((bool) "0"); // false ← diqqat!
var_dump((bool) []); // false — bo'sh massiv
var_dump((bool) null); // false
Qolgan hamma narsa — true. Hatto "false" matni ham, " " (bo'sh joy) ham, "0.0" ham.
Nima uchun shunday?
Nima uchun "0" false, lekin "0.0" true?
PHP veb uchun yaratilgan va formadan keladigan hamma narsa — matn. Checkbox tanlanmasa ko'pincha "0" keladi. PHP mualliflari "0" ni false deb hisoblashni qulay deb topishgan. "0.0" uchun bunday istisno qilinmagan. Bu tarixiy qaror — uni yod olish kerak, mantiq qidirmang.
Tez-tez uchraydigan xatolar
Formadan kelgan sonni tekshirmasdan ishlatish:
<?php
$miqdor = $_GET['miqdor']; // "3" — string
$jami = $miqdor * 15000; // ishlaydi, lekin "abc" kelsa — TypeError
To'g'risi — avval tekshirish va aylantirish:
<?php
$miqdor = (int) ($_GET['miqdor'] ?? 0);
Pulni float da hisoblash:
<?php
$jami = 0.1 + 0.7;
echo (int) ($jami * 10); // 7 — kutilgan 8 emas!
Xulosa
Eslab qoling:
- 5 ta asosiy tur:
int,float,string,bool,null var_dump()vais_*()funksiyalari — turni tekshirish- PHP turlarni o'zi o'zgartiradi — bu qulay, lekin tuzoq ham
(int),(float),(string),(bool)— qo'lda o'zgartirish0,"","0",[],null— false hisoblanadi- Pulni float da saqlamang
Keyingi dars
5-dars: Konstantalar — define(), const, sehrli konstantalar