Funksiyalar — e'lon qilish, parametr, return, default qiymat

~15 daq · PHP · Funksiyalar

Muammodan boshlaylik

Saytda narx 15 joyda chiqariladi. Har safar shunday yozasiz:

<?php

echo number_format($narx, 0, '', ' ') . " so'm";

Bir kuni buyurtmachi: "Narxlar so'm emas, UZS bilan chiqsin". Endi 15 ta faylni qidirasiz. Bittasini unutsangiz — saytda ikki xil format.

Yechim: bu kodni bir marta yozib, nom berish va kerakli joyda shu nom bilan chaqirish. Bu — funksiya.


Funksiya nima?

Funksiya — nom berilgan kod bo'lagi. Uni bir marta yozasiz, ko'p marta ishlatasiz.

Hayotiy o'xshatma: qahva mashinasi. Ichiga qahva doni va suv solasiz (parametrlar), tugmani bosasiz (chaqirish), tayyor qahva chiqadi (natija). Ichida nima bo'layotganini har safar o'ylashingiz shart emas.

<?php

function narxFormat($narx)
{
    return number_format($narx, 0, '', ' ') . " so'm";
}

echo narxFormat(249000);    // 249 000 so'm
echo narxFormat(3200000);   // 3 200 000 so'm

Endi formatni o'zgartirish kerak bo'lsa — faqat bitta joyni o'zgartirasiz.


Tuzilishi

<?php

function salomlash($ism)   // function — kalit so'z, salomlash — nom, $ism — parametr
{
    return "Salom, $ism!"; // return — natijani qaytarish
}

$xabar = salomlash("Lola");   // chaqirish, "Lola" — argument
echo $xabar;                  // Salom, Lola!
  • Parametr — funksiya e'lonidagi o'zgaruvchi ($ism)
  • Argument — chaqirishda beriladigan haqiqiy qiymat ("Lola")

Nomlash: funksiya nomi odatda camelCase va fe'l bilan boshlanadi — u nimadir qiladi: hisoblash(), foydalanuvchiniTop(), emailYubor().

Uslub (PSR-12): funksiya ochuvchi { alohida qatorda. if, for larda esa — bir qatorda. Bu standart, majburiy emas, lekin PHP jamiyatida shunday.


return — natija qaytarish

return ikki ish qiladi:

  1. Qiymatni chaqirgan joyga qaytaradi
  2. Funksiyani darhol to'xtatadi — keyingi qatorlar bajarilmaydi
<?php

function yoshToifasi($yosh)
{
    if ($yosh < 0) {
        return "Noto'g'ri yosh";
    }
    if ($yosh < 18) {
        return "Voyaga yetmagan";
    }
    return "Katta";
}

echo yoshToifasi(25);   // Katta

Bu "erta qaytish" (early return) usuli — ichma-ich if/else dan ancha o'qishli.

echo va return farqi

Yangi boshlovchilar eng ko'p adashadigan joy:

<?php

function a($x) { echo $x * 2; }     // ekranga chiqaradi, hech narsa qaytarmaydi
function b($x) { return $x * 2; }   // qaytaradi, ekranga chiqarmaydi

$natija1 = a(5);   // ekranda: 10, lekin $natija1 = null
$natija2 = b(5);   // ekranda: hech narsa, $natija2 = 10

echo $natija2 + 1; // 11

Qoida: funksiya odatda return qilsin. Natijani nima qilish (chiqarish, saqlash, yana hisoblash) — chaqiruvchining ishi. Shunda funksiyani istalgan joyda qayta ishlatish mumkin.

return yozilmagan funksiya null qaytaradi.


Bir nechta parametr

<?php

function chegirmaliNarx($narx, $foiz)
{
    return $narx - ($narx * $foiz / 100);
}

echo chegirmaliNarx(200000, 15);   // 170000

Argumentlar tartib bo'yicha parametrlarga tushadi. chegirmaliNarx(15, 200000) yozsangiz — mantiqan noto'g'ri natija chiqadi, lekin xato bermaydi.


Default qiymat

Parametrga standart qiymat berish mumkin — argument berilmasa, shu ishlatiladi:

<?php

function narxFormat($narx, $valyuta = "so'm")
{
    return number_format($narx, 0, '', ' ') . " $valyuta";
}

echo narxFormat(50000);          // 50 000 so'm
echo narxFormat(50000, "UZS");   // 50 000 UZS

Default qiymatli parametrlar oxirida turishi kerak:

<?php

function xato($valyuta = "so'm", $narx) { }
// Deprecated: Optional parameter $valyuta declared before required parameter $narx

Nomlangan argumentlar (PHP 8+)

Ko'p parametrli funksiyada tartibni eslash qiyin. Nom bilan berish mumkin:

<?php

function xabarYubor($kimga, $matn, $muhim = false, $nusxa = null)
{
    // ...
}

// Tartib bilan — $muhim nima ekanini bilish uchun funksiyaga qarash kerak
xabarYubor("ali@mail.uz", "Salom", false, "admin@mail.uz");

// Nom bilan — o'zi tushunarli, keraksizini o'tkazib yuborish mumkin
xabarYubor(kimga: "ali@mail.uz", matn: "Salom", nusxa: "admin@mail.uz");

O'rnatilgan funksiyalarda ham ishlaydi:

<?php

echo number_format(1250000, thousands_separator: ' ');   // 1 250 000

Ixtiyoriy sondagi argumentlar: ...

<?php

function yigindi(...$sonlar)
{
    return array_sum($sonlar);
}

echo yigindi(1, 2);           // 3
echo yigindi(5, 10, 15, 20);  // 50

...$sonlar — barcha argumentlarni massivga yig'adi.


Bir nechta qiymat qaytarish

return faqat bitta qiymat qaytaradi. Ko'p kerak bo'lsa — massiv qaytaring:

<?php

function minMax($sonlar)
{
    return [min($sonlar), max($sonlar)];
}

[$eng_kichik, $eng_katta] = minMax([4, 9, 1, 7]);
echo "$eng_kichik — $eng_katta";   // 1 — 9

Nima uchun shunday?

Nima uchun funksiya nomlari harfga sezgir emas (NarxFormat() ham ishlaydi), o'zgaruvchilar esa sezgir?

PHP ning dastlabki versiyalarida funksiyalar C tilidagi jadvalda kichik harfga o'tkazib saqlangan. O'zgaruvchilar esa boshqa mexanizmda, harflarni saqlagan holda. Orqaga moslik uchun bu shunday qolgan. Lekin bunga tayanmang — funksiyani qanday e'lon qilgan bo'lsangiz, shunday chaqiring.


Tez-tez uchraydigan xatolar

Argument yetishmasligi:

<?php

function qosh($a, $b) { return $a + $b; }
echo qosh(5);
// ArgumentCountError: Too few arguments to function qosh(), 1 passed and exactly 2 expected

Bir xil nomli funksiyani ikki marta e'lon qilish:

<?php

function salom() {}
function salom() {}
// Fatal error: Cannot redeclare salom()

Bu ko'pincha bitta faylni ikki marta include qilganda bo'ladi — require_once ishlating (18-dars).

Funksiya ichida tashqi o'zgaruvchini ishlatish:

<?php

$valyuta = "so'm";

function narx($n)
{
    return $n . " " . $valyuta;   // Warning: Undefined variable $valyuta
}

Funksiya tashqaridagi o'zgaruvchilarni ko'rmaydi. Bu xato emas — ataylab shunday. 16-darsda sababini ko'ramiz. Hozircha yechim: kerakli qiymatni parametr sifatida bering.


Xulosa

Eslab qoling:

  • function nom($parametr) { return ...; } — e'lon qilish
  • return — qiymat qaytaradi va funksiyani to'xtatadi
  • echo ≠ return: funksiya odatda qaytarsin, chiqarmasin
  • Default qiymatli parametrlar — oxirida
  • nom: qiymat — nomlangan argumentlar (PHP 8+)
  • ...$args — ixtiyoriy sondagi argumentlar
  • Funksiya tashqi o'zgaruvchilarni ko'rmaydi — parametr orqali bering

Keyingi dars

15-dars: Tur belgilash — parametr va qaytish turlari, strict_types