Stringlar — ' va " farqi, nuqta bilan birlashtirish, heredoc, funksiyalar

~20 daq · PHP · Kirish va Asoslar

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 tilidagi o', 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 \n ishlaydi; '...' — so'zma-so'z
  • . — birlashtirish, {$massiv['kalit']} — murakkab qiymatni qo'shish
  • trim, strtolower, str_replace, substr, explode, implode — eng ko'p ishlatiladiganlar
  • str_contains() — strpos() dan xavfsizroq
  • Kirill yoki emoji bo'lsa — mb_ funksiyalari
  • sprintf va number_format — chiroyli formatlash

Keyingi dars

8-dars: Shartlar — if, elseif, else, ternary operator