PHP

Funksiyalar

Çox vaxt proqramın bir çox hissələrində eyni kodu təkrar istifadə edirik. Eyni kodu proqramın müxtəlif hissələrində təkrar yazmamaq üçün funksiyalar düşünülüb.

PHP-də öncədən çoxlu sayda quraşdırılmış funksiya var. Bununla belə, özümüz də funksiyalar yarada bilərik.

İstifadəçi funksiyalarının elan edilməsi və çağrılması

Funksiya yaratmaq üçün onu elan etməliyik. Məsələn:

function funksiyanınAdı(arqument1, arqument2, ..., n sayda arqument)
{
    kod;
}

funksiyanın elan edilməsi

İlk əvvəl function açar sözü, ondan sonra funksiyanın adı, dairəvi mötərizələr daxilində bir-birindən vergüllə ayrılan arqumentlər, fiqurlu mötərizələr daxilində isə kod (həmçinin "funksiyanın bədəni" adlandırılır) gəlir. İstifadəçi tərəfindən yaradılmış funksiyaların adı PHP-yə quraşdırılmış funksiyalar kimi adlandırıla bilməz. Arqumentlərin sayı istənilən sayda ola bilər, yaxud ümumiyyətlə olmaya bilər. Funksiyaların adı dəyişənlərdə olduğu kimi eyni qaydalara əsaslanır. Əlavə olaraq onu qeyd edim, funksiya - bu, hər hansı əməliyyatdır. Ona görə funksiyanın adı adətən fellə başlanır. Məsələn, tövsiyə olunan funksiya adları:

showMessage(..)     // mesajı göstərir
getAge(..)          // yaşı geri qaytarır
calcSum(..)         // məbləği hesablayır
createForm(..)      // forma yaradır
checkPermission(..) // hansısa əməliyyata icazə verilməsini yoxlayır

Yuxarıdakı nümunədə funksiyaların adı onların gördüyü iş barədə məlumat verir.

Gəlin istifadəçinin adını ekrana çıxaran showUserName funksiyası yaradaq:

<?php

function showUserName() 
{
    echo 'John';
    echo '<br>';
}

Funksiyanı yaratdıq. İndi isə istifadəçinin adını ekrana çıxarmaq üçün funksiyanı çağıraq:

<?php

function showUserName()
{
    echo 'John';
    echo '<br>';
}

showUserName();

Nəticə:

John

Həmin funksiyanı bir neçə dəfə çağıraq:

<?php

function showUserName()
{
    echo 'John';
    echo '<br>';
}

showUserName();
showUserName();
showUserName();

Nəticə:

John
John
John

Əlbəttə, showUserName() funksiyası çox sadə nümunədir, lakin funksiyanın əsas məqsədlərindən birini - eyni kodun təkrar yazılmamasını yaxşı izah edir. Əgər ekrana başqa ad çıxarmaq lazımdırsa, proqram kodunun yalnız bir hissəsində dəyişiklik edilir.

Funksiyanın arqumentləri

Funksiyanın arqumentləri funksiya çağrılan zaman ona ötürülən məlumatlardır. Məsələn, aşağıdakı showSumOfNumbers() funksiyasına $num1$num2 arqumentləri ötürülür:

<?php

function showSumOfNumbers($num1, $num2)
{
    echo $num1 + $num2;
    echo '<br>';
}

showSumOfNumbers(10, 15);
showSumOfNumbers(5, -20);

Nəticə:

25
-15

Yuxarıdakı nümunədə showSumOfNumbers() funksiyası 2 dəfə çağrılır, 1-ci dəfə 10 və 15, ikinci dəfə isə 5 və -20 qiymətləri funksiyaya ötürülür. Həmin qiymətlər funksiyanın daxilində cəmlənir və nəticəsi ekrana çıxarılır.

Gəlin showSumOfNumbers() funksiyasını yenidən çağıraq və funksiyaya heç bir qiymət ötürməyək:

<?php

function showSumOfNumbers($num1, $num2)
{
    echo $num1 + $num2;
    echo '<br>';
}

showSumOfNumbers();

Nəticə:

Yuxarıdakı nümunədə showSumOfNumbers() funksiyası iki arqument gözləyir. Funksiya çağrılan zaman isə ona heç bir qiymət ötürülmür, nəticədə səhv qeydə alınır. Funksiyanın arqumentlərinə başlanğıc qiymət təyin edərək bu problemi həll etmək olar:

<?php

function showSumOfNumbers($num1 = 7, $num2 = 29)
{
    echo $num1 + $num2;
    echo '<br>';
}

showSumOfNumbers();

Nəticə:

36

Arqumentlərin qiymətə və ünvana görə ötürülməsi

İndiyədək baxdığımız nümunələrdə arqumentlər funksiyaya qiymətə görə ötürülüb. Arqumentlərin qiymətə görə ötürülməsi zamanı qiymətlər lokal dəyişənlərə köçürülür. Bu o deməkdir ki, arqumentin qiyməti yalnız funksiyanın daxilində dəyişdirilə bilər və bu dəyişiklik funksiyadan kənarda arqumentin qiymətinə təsir etmir. Daha yaxşı başa düşmək üçün gəlin aşağıdakı nümunəyə baxaq:

<?php

function showNumber($x)
{
    $x += 5;
    echo $x;
    echo '<br>';
}

$num = 4;

showNumber($num); // 9

echo $num; // 4

Nəticə:

9
4

showNumber() funksiyasını çağırdıqda $num dəyişəninin qiyməti (4) $x lokal dəyişəninə köçürülür. Funksiyanın daxilində $x dəyişəninin qiymətinin (4) üzərinə 5 əlavə edilir və ekranda 9 çap edilir. Artıq bildiyimiz kimi, funksiya öz işini bitirdikdə lokal dəyişənlər silinir.

Əgər funksiyanın ona ötürülən arqumentlərə dəyişiklik etməsini istəyirsinizsə, onda arqumentləri ünvana görə ötürməlisiniz. Bu məqsədlə arqumentin adının qarşısında ampersand (&) işarəsi qoymaq lazımdır:

<?php

function showNumber(&$x)
{
    $x += 5;
    echo $x;
    echo '<br>';
}

$num = 4;

showNumber($num);

echo $num;

Nəticə:

9
9

Adlı arqumentlər

PHP 8-də əlçatan olan adlı arqumentlərin köməyilə artıq funksiyanın arqumentlərini parametrlərin adına görə də ötürmək mümkündür. Daha yaxşı başa düşmək üçün gəlin nümunələrə baxaq. PHP 8-dək funksiyanın arqumentləri yalnız funksiyanın özündə təyin edilmiş ardıcıllıqla ona ötürülə bilərdi:

<?php

$numbers = [15, 3, 7, 9, 10];

var_dump(array_search(10, $numbers));

Nəticə:

4

PHP 8-də isə adlı arqumentlərin köməyilə artıq funksiyanın arqumentlərini parametrlərin adına görə də ötürmək mümkündür. Adlı arqumentlər kodu daha oxunaqlı edir:

<?php

$numbers = [15, 3, 7, 9, 10];

var_dump(array_search(haystack: $numbers, needle: 10));

Nəticə:

4

Yuxarıdakı nümunədən göründüyü kimi adlı arqumentlərin ardıcıllığı vacib deyil.

Əgər funksiyanın başlanğıc qiyməti varsa, adlı arqumentlərdən istifadə daha faydalıdır. Məsələn, aşağıdakı kodda pad_type arqumentinin qiymətini dəyişmək istəyiriksə, pad_string arqumenti üçün başlanğıc qiyməti göstərməliyik:

<?php

$str = str_pad('Hello', 9, ' ', STR_PAD_BOTH);

str_pad() funksiyasının yazılış sintaksisi aşağıdakı kimidir:

 str_pad(
    string $string,
    int $length,
    string $pad_string = " ",
    int $pad_type = STR_PAD_RIGHT
): string

Yazılış sintaksisindən göründüyü kimi, str_pad() funksiyasında pad_string arqumenti üçün başlanğıc qiymət göstərilməlidir.

Adlı arqument isə başlanğıc qiyməti yazmamağa imkan verir. Məsələn:

<?php
 
$str = str_pad('Hello', 9, pad_type: STR_PAD_BOTH);

Lokal və qlobal dəyişənlər

Funksiyanın parametrləri və fiqurlu mötərizələr daxilində olan dəyişənlər lokal dəyişənlər adlanır. Funksiya öz işini bitirdikdə lokal dəyişənlər silinir. Funksiyadan kənar dəyişənlər isə qlobal dəyişənlər adlanır və funksiyanın daxilində əlçatmazdır. Lokal və qlobal dəyişənlərin adlarının eyni olması mümkündür, lakin bu, 2 fərqli dəyişəndir.

lokal və qlobal dəyişənlər

Daha yaxşı başa düşmək üçün gəlin aşağıdakı nümunəyə baxaq:

<?php

function showSumOfNumbers($num1, $num2)
{
    $num1 += $num2;
    echo $num1;
    echo '<br>';
}

$num1 = 10;

showSumOfNumbers($num1, 20);

echo $num1;

Nəticə:

30
10

Yuxarıdakı nümunədə showSumOfNumbers funksiyasına $num1 dəyişənin qiyməti - 10 və 20 ötürülür. Funksiyanın daxilində $num1 dəyişəninə $num1$num2 dəyişənlərinin qiymətlərinin cəmi mənimsədilir. $num1 dəyişənin qiyməti 30 olur və ekrana çıxarılır. Funksiyanın daxilində $num1 dəyişəni lokal dəyişəndir, ona görə funksiya işini bitirən kimi silinir.

Qiymətin geri qaytarılması

Funksiya, həmçinin nəticəni geri qaytara bilər. Geri qaytarılan qiymətlər istənilən tipdə, həmçinin massiv və obyekt ola bilərlər. Məsələn:

<?php

function sum($x, $y)
{
    return $x + $y;
}

echo sum(10, 15) . '<br>';
echo sum(5, -15) . '<br>';
echo sum(23, 45) . '<br>';

Nəticə:

25
-10
68

PHP interpretatoru return konstruksiyasından sonra funksiyanın işini dayandırır və həmin konstruksiyadan sonra yazılanlar artıq icra olunmur:

<?php

function sum($x, $y)
{
    return $x + $y;

    echo 'Hər kəsə salam';
    echo 5 + 7;
}

echo sum(10, 15);

Nəticə:

25

Yuxarıdakı nümunədə sum() funksiyası ona ötürülən qiymətlərin (10, 15) cəmini geri qaytarır. PHP interpretatoru return konstruksiyasından sonra funksiyanın işini dayandırır və buna görə echo 'Hər kəsə salam', echo 5 +7 ifadələri icra olunmur.

Həmçinin geri qaytarılan qiyməti dəyişənə mənimsədə bilərik. Məsələn:

<?php

function sum($x, $y)
{
    return $x + $y;
}

$total = sum(5, 3);
echo $total;

Nəticə:

8

return konstruksiyası yalnız qiymət geri qaytarmaq üçün deyil, sadəcə funksiyanın işini dayandırmaq üçün də istifadə edilə bilər. Məsələn:

<?php

function sum($x = 8, $y = 7)
{
    $sum = $x + $y;

    if ($sum < 10) {
        return;
    }
    echo $sum;
}

sum(5, 3);
sum();

Nəticə:

15

Yuxarıdakı nümunədə sum() funksiyası 2 dəfə çağrılır. 1-ci dəfə 5 və 3 qiymətləri funksiyaya ötürülür. Funksiyanın daxilində 5 və 3 ədədlərinin cəmi $sum dəyişəninə mənimsədilir. Sonra şərt yoxlanılır. Şərtin nəticəsi true (yalan) olduğuna görə return konstruksiyası icra olunur və funksiya işini dayandırır. 5 və 3 ədədlərinin cəmi ekranda göstərilmir. sum() funksiyası 2-ci dəfə çağrıldıqda funksiyaya heç bir qiymət ötürülmür, başlanğıc qiymətlərdən (8 və 7) istifadə edilir. Eyni qayda ilə 8 və 7 ədədlərinin cəmi $sum dəyişəninə mənimsədilir, sonra şərt yoxlanılır. 15 ədədi 10-dan böyük olduğuna görə şərtin nəticəsi false (yalan) olur və fiqurlu mötərizə daxilində olan return konstruksiyası icra olunmur. 15 ədədi ekranda göstərilir.

Arqument tip yoxlamaları

Tip yoxlaması arqumentin qiymətinə məhdudiyyət qoyulmasını bildirir. Belə yoxlama PHP interpretatoruna arqumentin ala biləcəyi qiyməti göstərir. Nəticədə yanlış qiymət daxil edildikdə, PHP interpretatoru ekranda xəbərdarlıq göstərir. Arqument üçün aşağıdakı tip yoxlamaları əlçatandır:

Tip yoxlaması Arqument üçün qayda Dəstəklənən PHP versiyası
array massiv olmalıdır 5.1.0
bool true və ya false olmalıdır 7.0.0
float həqiqi ədəd olmalıdır 7.0.0
int tam ədəd olmalıdır 7.0.0
string sətir olmalıdır 7.0.0
mixed istənilən tip ola bilər 8.0.0

Funksiyanın elan edilməsi zamanı tip yoxlaması arqumentin adının qarşısında göstərilir.

<?php

function getSum(int $x, int $y)
{
    return $x + $y;
}

echo getSum(5.5, true);

Nəticə:

6

PHP standart olaraq zəif tip-yoxlama rejimində işləyir və buna görə də arqumentin qiyməti avtomatik olaraq göstərilən tipə çevrilir. Yəni, getSum() funksiyasını çağırdıqda ona ötürülən 5.5 qiyməti tam ədədə (int tipi) çevrilərkən 5, true isə tam ədədə çevrilərkən 1 olur. Burda daha ətraflı oxuya bilərsiniz.

Arqumentin qiyməti avtomatik olaraq göstərilən tipə çevrilmədikdə PHP interpretatoru ekranda xəbərdarlıq göstərir. Məsələn:

<?php

function getSum(int $x, int $y)
{
    return $x + $y;
}

echo getSum('üç', true);

Nəticə:

arqument tip yoxlaması

Ciddi tip-yoxlama rejimi

Artıq yuxarıda qeyd etdiyim kimi, PHP standart olaraq zəif tip-yoxlama rejimində işləyir və buna görə də arqumentin qiyməti avtomatik olaraq göstərilən tipə çevrilir. Ancaq ciddi tip-yoxlama rejimi də əlçatandır. Bunun üçün PHP faylının əvvəlində aşağıdakı direktiv yazılır:

declare(strict_types=1);

Məsələn:

<?php
declare(strict_types=1);

function getSum(int $x, int $y)
{
    return $x + $y;
}

echo getSum(5.5, "15");

Yuxarıdakı PHP kodu işə salsaq, TypeError səhvi qeydə alınacaq:

ciddi tip-yoxlama rejimi

Bildirilir ki, getSum() funksiyasına ötürülən birinci arqumentin tipi int (tam ədəd) olmalıdır, lakin float tipi ötürülüb.

0

Şərh yazmaq üçün hesabınıza daxil olun.