Ma'lumot turlari — int, float, string, bool, null va tur o'zgartirish

~15 daq · PHP · Kirish va Asoslar

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() va is_*() funksiyalari — turni tekshirish
  • PHP turlarni o'zi o'zgartiradi — bu qulay, lekin tuzoq ham
  • (int), (float), (string), (bool) — qo'lda o'zgartirish
  • 0, "", "0", [], null — false hisoblanadi
  • Pulni float da saqlamang

Keyingi dars

5-dars: Konstantalar — define(), const, sehrli konstantalar