Stringlar — ' va " farqi, nuqta bilan birlashtirish, heredoc, funksiyalar
Muammodan boshlaylik
Veb dasturlashning katta qismi — matn bilan ishlash. Foydalanuvchi ismi, email, izoh matni, URL, HTML parchalari... Foydalanuvchi emailini Ali@Mail.UZ deb kiritdi — boshida bo'sh joy, katta harflar. Bazada esa ali@mail.uz. Ular teng emas, foydalanuvchi kira olmaydi.
Matnni tozalash, qidirish, kesish, almashtirish — har kuni kerak bo'ladigan ishlar. Bu darsda shularni o'rganamiz.
' va " — asosiy farq
PHP da string ikki xil qo'shtirnoqda yoziladi va ular bir xil emas.
Qo'shtirnoq "..." — ichidagi o'zgaruvchilarni almashtiradi:
<?php
$ism = "Nodira";
echo "Salom, $ism!"; // Salom, Nodira!
Bittalik tirnoq '...' — hamma narsani so'zma-so'z chiqaradi:
<?php
$ism = "Nodira";
echo 'Salom, $ism!'; // Salom, $ism!
Maxsus belgilar ham faqat " ichida ishlaydi:
<?php
echo "Birinchi\nIkkinchi"; // ikki qatorga bo'linadi
echo 'Birinchi\nIkkinchi'; // Birinchi\nIkkinchi — so'zma-so'z
| Belgi | Ma'nosi |
|---|---|
\n |
Yangi qator |
\t |
Tab |
\" |
Qo'shtirnoqning o'zi |
\\ |
Teskari slash |
\$ |
Dollar belgisi (o'zgaruvchi emas) |
Qoida: ichida o'zgaruvchi yoki \n bo'lmasa — ' ishlating. Bu PHP ga "bu yerda hech narsa almashtirish shart emas" deb aytadi va kodni o'qiyotganga ham aniq.
Murakkab o'zgaruvchilarni qo'shish: {}
Massiv elementi yoki ob'ekt xususiyatini string ichiga qo'yish uchun jingalak qavs:
<?php
$foydalanuvchi = ['ism' => 'Bekzod', 'yosh' => 28];
echo "Ism: {$foydalanuvchi['ism']}"; // Ism: Bekzod
$mahsulot = "olma";
echo "Bizda {$mahsulot}lar bor"; // Bizda olmalar bor
echo "Bizda $mahsulotlar bor"; // Warning: Undefined variable $mahsulotlar
Oxirgi misolda PHP $mahsulotlar ni bitta o'zgaruvchi deb o'yladi. {} chegarani aniq ko'rsatadi.
Birlashtirish: .
<?php
$ism = "Aziz";
$yosh = 30;
echo "Ism: " . $ism . ", yosh: " . $yosh;
echo "Ism: $ism, yosh: $yosh"; // aynan bir xil natija
Ikkala usul ham to'g'ri. Qisqa matnda — "..." ichida o'zgaruvchi, murakkab ifodada — .:
<?php
echo "Jami: " . ($narx * $miqdor) . " so'm";
Heredoc va Nowdoc — ko'p qatorli matn
Katta HTML yoki email matnini yozish uchun:
<?php
$ism = "Malika";
$buyurtma = 1042;
$xat = <<<MATN
Hurmatli $ism,
Sizning #$buyurtma raqamli buyurtmangiz qabul qilindi.
Tez orada operatorimiz bog'lanadi.
Rahmat!
MATN;
echo $xat;
Bu — heredoc: " kabi ishlaydi, o'zgaruvchilar almashtiriladi. Yopuvchi MATN; alohida qatorda bo'lishi kerak.
Nowdoc — ' kabi, hech narsani almashtirmaydi. Belgi nomi bittalik tirnoqda yoziladi:
<?php
$kod = <<<'KOD'
echo "Salom, $ism";
KOD;
echo $kod; // echo "Salom, $ism"; — so'zma-so'z
Asosiy string funksiyalari
Uzunlik
<?php
echo strlen("Salom"); // 5
echo strlen("Salom 👋"); // 10 — emoji 4 bayt!
echo mb_strlen("Salom 👋"); // 7 — haqiqiy belgilar soni
[!WARNING]
strlen()baytlarni sanaydi, belgilarni emas. O'zbek tilidagio',g'muammo qilmaydi, lekin kirill (Салом) yoki emoji bilan ishlasangiz —mb_bilan boshlanadigan funksiyalardan foydalaning:mb_strlen,mb_substr,mb_strtoupper.
Katta-kichik harf
<?php
echo strtoupper("salom"); // SALOM
echo strtolower("SALOM"); // salom
echo ucfirst("salom dunyo"); // Salom dunyo
echo ucwords("salom dunyo"); // Salom Dunyo
Bo'sh joylarni olib tashlash
<?php
$email = " ali@mail.uz ";
echo trim($email); // "ali@mail.uz"
echo ltrim($email); // faqat chap tomondan
echo rtrim($email); // faqat o'ng tomondan
Muammodagi email misolini hal qilamiz:
<?php
$kiritilgan = " Ali@Mail.UZ ";
$toza = strtolower(trim($kiritilgan));
echo $toza; // ali@mail.uz
Qidirish
<?php
$matn = "PHP veb uchun yaratilgan til";
var_dump(str_contains($matn, "veb")); // bool(true) — PHP 8+
var_dump(str_starts_with($matn, "PHP")); // bool(true)
var_dump(str_ends_with($matn, "til")); // bool(true)
echo strpos($matn, "veb"); // 4 — qaysi pozitsiyada (0 dan sanaladi)
strpos() tuzog'i — topilmasa false, boshida topilsa 0 qaytaradi:
<?php
if (strpos("PHP kursi", "PHP")) {
echo "topildi"; // ❌ chiqmaydi! chunki 0 — false hisoblanadi
}
if (strpos("PHP kursi", "PHP") !== false) {
echo "topildi"; // ✅ to'g'ri
}
PHP 8 da shunchaki str_contains() ishlating — bu muammo yo'q.
Kesib olish va almashtirish
<?php
$matn = "Toshkent shahri";
echo substr($matn, 0, 8); // Toshkent — 0 dan boshlab 8 ta
echo substr($matn, -6); // shahri — oxiridan 6 ta
echo str_replace("shahri", "viloyati", $matn); // Toshkent viloyati
Bo'lish va birlashtirish
<?php
$teglar = "php,mysql,laravel";
$massiv = explode(",", $teglar); // ['php', 'mysql', 'laravel']
echo implode(" | ", $massiv); // php | mysql | laravel
explode — matnni bo'laklarga, implode — bo'laklarni matnga.
Boshqa foydalilari
<?php
echo str_repeat("-", 20); // --------------------
echo str_pad("7", 3, "0", STR_PAD_LEFT); // 007
echo strrev("salom"); // molas
echo number_format(1250000); // 1,250,000
echo number_format(1250000, 0, '', ' '); // 1 250 000
number_format narxlarni chiroyli chiqarishda juda kerak.
sprintf — shablon bo'yicha formatlash
<?php
$ism = "Jasur";
$ball = 87.456;
echo sprintf("%s %d ball to'pladi", $ism, 87); // Jasur 87 ball to'pladi
echo sprintf("O'rtacha: %.2f", $ball); // O'rtacha: 87.46
echo sprintf("ID: %05d", 42); // ID: 00042
| Belgi | Nima uchun |
|---|---|
%s |
String |
%d |
Butun son |
%.2f |
Kasr son, 2 xona |
%05d |
5 xonali, oldi nol bilan to'ldiriladi |
printf() — xuddi shunday, lekin natijani darhol chiqaradi.
Nima uchun shunday?
Nima uchun PHP da string funksiyalari nomlari tartibsiz? strlen, str_replace, substr, ucfirst...
Chunki PHP dastlab C kutubxonasi funksiyalarini qanday bo'lsa shunday o'rab olgan — strlen, strpos nomlari C dan keladi. Keyingi funksiyalar boshqa odamlar tomonidan, boshqa uslubda qo'shilgan. Orqaga moslik (eski kod buzilmasligi) uchun nomlarni o'zgartirib bo'lmaydi. Bu PHP ning eng ko'p tanqid qilinadigan tomoni — lekin muharrir (IDE) avtomatik to'ldirish bilan bu muammo emas.
Tez-tez uchraydigan xatolar
' ichida o'zgaruvchi kutish:
<?php
$ism = "Ali";
echo 'Salom, $ism'; // Salom, $ism — almashtirilmadi
Qo'shtirnoq ichida qo'shtirnoq:
<?php
echo "U "salom" dedi"; // Parse error
echo "U \"salom\" dedi"; // ✅
echo 'U "salom" dedi'; // ✅ — oddiyroq
O'zbekcha tutuq belgisi:
<?php
echo 'O'zbekiston'; // Parse error — ' matnni yopib qo'ydi
echo "O'zbekiston"; // ✅
echo 'O\'zbekiston'; // ✅
O'zbek tilidagi matnlar uchun " qulayroq.
Xulosa
Eslab qoling:
"..."— o'zgaruvchilar va\nishlaydi;'...'— so'zma-so'z.— birlashtirish,{$massiv['kalit']}— murakkab qiymatni qo'shishtrim,strtolower,str_replace,substr,explode,implode— eng ko'p ishlatiladiganlarstr_contains()—strpos()dan xavfsizroq- Kirill yoki emoji bo'lsa —
mb_funksiyalari sprintfvanumber_format— chiroyli formatlash
Keyingi dars
8-dars: Shartlar — if, elseif, else, ternary operator