Tarkibga o'tish

1.9 Funksiyalar

⬅️ Oldingi: 1.8 Ro'yxatlar (massivlar) Β· 🏠 README Β· Keyingi: 1.10 Anonim funksiyalar va massiv vositalari (map / filter / reduce) ➑️


1.5'da PHP bergan tayyor funksiyalardan (strlen, trim) foydalangan edik. Endi o'z funksiyalarimizni yozishni o'rganamiz. Bu β€” kodni tartibga solishning eng muhim usuli.

Funksiya nima va nega kerak?

Funksiya β€” biror ishni bajaradigan, nom berilgan kod bo'lagi. Bir marta yozasiz, keyin nomini chaqirib, istalgancha marta ishlatasiz.

Nega kerak? Tasavvur qiling, dasturingizning 5 ta joyida bir xil hisob-kitob bor. Funksiyasiz β€” o'sha kodni 5 marta nusxalaysiz. Agar xato topilsa β€” 5 joyni tuzatasiz. Funksiya bilan β€” bir joyda yozasiz, 5 joyda chaqirasiz, xatoni bir joyda tuzatasiz. Bu β€” "takrorlanishdan qoching" degan muhim qoidaning asosi.

Oddiy funksiya

<?php
function salomlash() {
    echo "Salom, xush kelibsiz!";
}

// Funksiyani chaqirish (ishga tushirish):
salomlash();   // Salom, xush kelibsiz!
salomlash();   // yana chaqirsak β€” yana ishlaydi

Tuzilishi: - function β€” "funksiya yarataman" degan so'z. - salomlash β€” funksiya nomi (o'zingiz tanlaysiz, mazmunli bo'lsin). - ( ) β€” qavs (hozir bo'sh; keyinroq ichiga "kirish ma'lumotlari"ni yozamiz). - { } β€” funksiya bajaradigan kod shu ichida.

Funksiyani yozish β€” bu uni ishga tushirish emas. U faqat chaqirilganda (salomlash();) ishlaydi.

Funksiyaga ma'lumot berish (parametrlar)

Ko'pincha funksiyaga "kirish ma'lumoti" berish kerak. Masalan, "kimni salomlashni" aytish. Bu ma'lumotlar qavs ichiga yoziladi va parametr deyiladi:

<?php
function salomlash($ism) {
    echo "Salom, " . $ism . "!";
}

salomlash("Ali");    // Salom, Ali!
salomlash("Vali");   // Salom, Vali!

Bu yerda $ism β€” parametr. Funksiyani chaqirganda qavs ichiga bergan qiymat ("Ali") $ismga tushadi. Endi bitta funksiya har xil ism bilan ishlaydi.

Bir nechta parametr ham berish mumkin (vergul bilan):

<?php
function tanishtir($ism, $yosh) {
    echo $ism . ", " . $yosh . " yosh";
}

tanishtir("Ali", 19);   // Ali, 19 yosh

Natija qaytarish β€” return

Hozirgi funksiyalar ekranga chiqarardi (echo). Lekin ko'pincha funksiya biror natijani hisoblab, qaytarishi kerak β€” shunda natijani keyin ishlatamiz. Buning uchun return ishlatiladi:

<?php
function yigindi($a, $b) {
    return $a + $b;   // natijani qaytaradi (ekranga chiqarmaydi)
}

$natija = yigindi(5, 3);   // funksiya 8 ni qaytaradi, $natija ga tushadi
echo $natija;              // 8

// To'g'ridan-to'g'ri ham ishlatish mumkin:
echo yigindi(10, 20);      // 30

echo va return farqi β€” bu muhim: - echo β€” natijani darrov ekranga chiqaradi, lekin uni keyin ishlata olmaysiz. - return β€” natijani qaytaradi, siz uni o'zgaruvchiga saqlab, keyin xohlagancha ishlatasiz (qo'shasiz, taqqoslaysiz, chiqarasiz).

Ko'pincha return to'g'ri tanlov, chunki u funksiyani moslashuvchanroq qiladi. return bajarilgach, funksiya darrov tugaydi (undan keyingi kod ishlamaydi).

Funksiya chaqiruvini sxemada ko'ramiz: argumentlar funksiyaga kiradi, ichida hisob bajariladi, return esa natijani tashqariga qaytaradi.

Funksiya chaqiruvi: argumentlar kiradi, return natija qaytaradi

Standart (default) qiymatli parametr

Parametrga oldindan qiymat berib qo'yish mumkin β€” agar chaqirganda qiymat berilmasa, shu ishlatiladi:

<?php
function salomlash($ism = "mehmon") {
    echo "Salom, " . $ism;
}

salomlash("Ali");   // Salom, Ali
salomlash();        // Salom, mehmon   (qiymat berilmadi β†’ standart ishlatildi)

Funksiya ichidagi o'zgaruvchilar "tashqarida ko'rinmaydi"

Funksiya ichida yaratilgan o'zgaruvchi faqat o'sha funksiya ichida yashaydi. Tashqarida u mavjud emas:

<?php
function hisobla() {
    $natija = 100;   // bu o'zgaruvchi faqat funksiya ichida
}

hisobla();
// echo $natija;   // XATO! $natija bu yerda mavjud emas

Bu β€” yaxshi narsa: har bir funksiya "o'z dunyosi"da ishlaydi, bir-biriga xalaqit bermaydi. Tashqaridan ma'lumot kerak bo'lsa β€” parametr orqali berasiz; natija kerak bo'lsa β€” return bilan qaytarasiz.

Tip e'lonlari (type declarations) β€” funksiyani ishonchli qilish

Hozirgacha parametrlar tipsiz edi: function yigindi($a, $b). Lekin PHP'da parametr va natija tipini ko'rsatish mumkin β€” bu professional standart. Funksiya qanday ma'lumot kutishini va nima qaytarishini aniq aytadi:

<?php
function yigindi(int $a, int $b): int {
    return $a + $b;
}

echo yigindi(5, 3);   // 8
  • int $a, int $b β€” "bu parametrlar butun son bo'lishi kerak".
  • : int β€” "funksiya butun son qaytaradi" (qavsdan keyin, { dan oldin).

Asosiy tiplar: int, float, string, bool, array. Standart qiymat bilan birga ham ishlaydi:

<?php
function chegirma(float $narx, float $foiz = 10.0): float {
    return $narx - ($narx * $foiz / 100);
}

echo chegirma(1000);   // 900

null bo'lishi mumkin bo'lsa β€” ? qo'yiladi, qiymat qaytarmasa β€” void:

<?php
function salomla(?string $ism): void {     // $ism string yoki null
    echo "Salom, " . ($ism ?? "mehmon");   // void β€” hech narsa qaytarmaydi
}

salomla(null);    // Salom, mehmon
salomla("Ali");   // Salom, Ali

strict_types β€” qat'iy tip nazorati

Standart holatda PHP tiplarni "yumshoq" tekshiradi: yigindi("5", 3) da "5" ni avtomatik 5 ga aylantiradi. Bu xatolarni yashirishi mumkin. Buni oldini olish uchun fayl eng boshiga (<?php dan keyin, birinchi qator) shuni yozing:

<?php
declare(strict_types=1);

function kvadrat(int $n): int {
    return $n * $n;
}

echo kvadrat(5);     // 25  β€” to'g'ri
echo kvadrat("5");   // ❌ TypeError: int kutilgan, string berildi

strict_types=1 bilan PHP avtomatik aylantirmaydi β€” noto'g'ri tip berilsa, darrov TypeError beradi. Bu yaxshi: xato yashirinib qolmasdan, darrov ko'rinadi.

Why: tip e'lonlari kodni o'zini-o'zi hujjatlaydigan va ishonchli qiladi. Funksiyani ko'rgan odam (yoki kelajakdagi siz) nima kutilishini darrov tushunadi, noto'g'ri ma'lumot esa yashirinmasdan xato beradi. Professional PHP kodida tiplar va strict_types=1 β€” odat. Boshlanishida hamma funksiyaga tip yozishni mashq qiling.

Mashqlar

Oson 1. salom() funksiyasini yozing β€” chaqirilganda "Assalomu alaykum" chiqarsin. 2. kvadrat($son) funksiyasini yozing β€” sonni o'ziga ko'paytirib qaytarsin (return bilan). 3. kopaytir($a, $b) funksiyasini yozing β€” ikki sonning ko'paytmasini qaytarsin. 4. tanishtir($ism, $shahar) funksiyasini yozing β€” "Men Ali, Toshkentdanman" shaklida chiqarsin. 5. Standart qiymatli funksiya yozing: salomlash($ism = "do'st").

O'rta 6. eng_katta($a, $b) funksiyasini yozing β€” ikki sondan kattasini qaytarsin (if bilan). 7. juftmi($son) funksiyasini yozing β€” son juft bo'lsa true, toq bo'lsa false qaytarsin. 8. salom_narx($narx) funksiyasi: narxni olib, 12% QQS qo'shilgan yakuniy narxni qaytarsin. 9. harf_sanash($matn) funksiyasi: matndagi belgilar sonini qaytarsin (strlendan foydalaning). 10. chegirma($narx, $foiz) funksiyasi: narx va chegirma foizini olib, chegirmadan keyingi narxni qaytarsin.

Qiyin 11. massiv_yigindi($sonlar) funksiyasi: son massivini parametr sifatida olib, ularning yig'indisini qaytarsin (foreach bilan). 12. eng_katta_massivda($sonlar) funksiyasi: massivdagi eng katta sonni qaytarsin. 13. salomlash_royxat($ismlar) funksiyasi: ismlar massivini olib, har birini "Salom, Ali" ko'rinishida chiqarsin. 14. tubmi($son) funksiyasi: son tub bo'lsa true, aks holda false qaytarsin (1.7'dagi tub son mantig'ini funksiyaga aylantiring). 15. Tip e'lonlari bilan: kopaytir(int $a, int $b): int funksiyasini yozing. Keyin kopaytir("5", 2) deb chaqiring va faylga declare(strict_types=1) qo'yib/olib, xulq farqini kuzating. 16. formatNarx(float $narx, string $valyuta = "so'm"): string funksiyasi: narxni number_format bilan formatlab, valyuta bilan qaytarsin (masalan, 1,500.00 so'm).

Yechim β€” 7
<?php
function juftmi($son) {
    if ($son % 2 == 0) {
        return true;
    } else {
        return false;
    }
}

var_dump(juftmi(4));   // bool(true)
var_dump(juftmi(7));   // bool(false)

Aslida buni qisqaroq ham yozish mumkin, chunki $son % 2 == 0 ning o'zi true/false qiymat beradi:

<?php
function juftmi($son) {
    return $son % 2 == 0;   // to'g'ridan-to'g'ri natijani qaytaradi
}
Ikkala variant ham bir xil ishlaydi. Ikkinchisi tajribali dasturchilar yozadigan toza usul.

Yechim β€” 11 (massiv yig'indisi funksiyada)

<?php
function massiv_yigindi($sonlar) {
    $yigindi = 0;
    foreach ($sonlar as $son) {
        $yigindi += $son;
    }
    return $yigindi;
}

$mening_sonlarim = [10, 20, 30];
echo massiv_yigindi($mening_sonlarim);   // 60
E'tibor bering: parametr massiv ham bo'lishi mumkin. Funksiya massivni qabul qilib, ichidan o'tib, bitta natija qaytaradi. Bu β€” funksiyalarning kuchini ko'rsatadi: bir marta yozasiz, istalgan massiv bilan ishlaydi.

Yechim β€” 12 (massivdagi eng katta son)

<?php
function eng_katta_massivda(array $sonlar) {
    $eng_katta = $sonlar[0];          // birinchisini boshlang'ich deb olamiz
    foreach ($sonlar as $son) {
        if ($son > $eng_katta) {
            $eng_katta = $son;
        }
    }
    return $eng_katta;
}

echo eng_katta_massivda([3, 99, 12, 50]);   // 99
1.8'dagi "eng katta son" mantig'ini funksiyaga aylantirdik β€” endi uni istalgan massiv bilan chaqirish mumkin. (Albatta, tayyor max($sonlar) ham bor; bu yerda esa mantiqni o'zimiz yozib mashq qildik.)

Yechim β€” 13 (ro'yxatni salomlash)

<?php
function salomlash_royxat(array $ismlar): void {
    foreach ($ismlar as $ism) {
        echo "Salom, " . $ism . "<br>";
    }
}

salomlash_royxat(["Ali", "Vali", "Guli"]);
// Salom, Ali
// Salom, Vali
// Salom, Guli
Funksiya massivni oladi va har bir elementni foreach bilan chiqaradi. Hech narsa qaytarmagani uchun : void.

Yechim β€” 14 (tubmi funksiyasi)

<?php
function tubmi(int $son): bool {
    if ($son < 2) {
        return false;
    }
    for ($i = 2; $i * $i <= $son; $i++) {
        if ($son % $i == 0) {
            return false;     // bo'lindi β†’ tub emas
        }
    }
    return true;              // hech narsaga bo'linmadi β†’ tub
}

var_dump(tubmi(7));    // true
var_dump(tubmi(9));    // false
1.7'dagi tub son mantig'ini funksiyaga oldik. E'tibor bering: bu yerda $tub o'zgaruvchisi kerak emas β€” bo'linish topilishi bilan darrov return false qilamiz; sikl tugaguncha hech narsa topilmasa return true. Bu β€” funksiyada returnning qulayligi.

Yechim β€” 15 (tip e'lonlari va strict_types)

<?php
declare(strict_types=1);

function kopaytir(int $a, int $b): int {
    return $a * $b;
}

echo kopaytir(5, 2);     // 10  β€” to'g'ri
echo kopaytir("5", 2);   // ❌ TypeError (strict_types=1 tufayli)
declare(strict_types=1) ni o'chirsangiz, kopaytir("5", 2) "5" ni 5 ga aylantirib 10 beradi. Qat'iy rejimda esa darrov xato β€” bu xatolarni yashirinishdan saqlaydi. Shuning uchun professional kodda qat'iy rejim afzal.

Yechim β€” 16 (formatlangan narx funksiyasi)

<?php
declare(strict_types=1);

function formatNarx(float $narx, string $valyuta = "so'm"): string {
    return number_format($narx, 2) . " " . $valyuta;
}

echo formatNarx(1500);            // 1,500.00 so'm
echo "<br>";
echo formatNarx(2500.5, "USD");   // 2,500.50 USD
Funksiya tiplangan (float, string), standart qiymatli ($valyuta = "so'm") va matn qaytaradi (: string). 1.5'da o'rgangan number_format shu yerda asqotdi.