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.
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:
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:
Yechim β 11 (massiv yig'indisi funksiyada)
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
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
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
$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
float, string), standart qiymatli ($valyuta = "so'm") va matn qaytaradi (: string). 1.5'da o'rgangan number_format shu yerda asqotdi.