0%

⚙️ PHP Funkcijas

Funkcijas ir atkārtoti izmantojami koda bloki. Tās palīdz sakārtot kodu, izvairīties no dublikātiem un atvieglot uzturēšanu.

php

Funkciju definēšana

Teksts
<?php
// Funkcijas definēšana
function sveiciens(): void {
    echo "Sveika, pasaule!<br>";
}

// Izsaukšana
sveiciens(); // Sveika, pasaule!

// Funkcija ar parametriem
function sveicināt(string $vārds): void {
    echo "Sveicināts, $vārds!<br>";
}

sveicināt("Anna");  // Sveicināts, Anna!
sveicināt("Pēteris"); // Sveicināts, Pēteris!

// Atgriežot vērtību
function saskaitīt(int $a, int $b): int {
    return $a + $b;
}

$rezultāts = saskaitīt(5, 3);
echo $rezultāts . "<br>"; // 8

// Vairāku parametru un noklusējuma vērtību
function pilnsSveiciens(string $vārds, string $valoda = "lv"): string {
    return match($valoda) {
        "lv" => "Sveicināts, $vārds!",
        "en" => "Hello, $vārds!",
        "de" => "Hallo, $vārds!",
        default => "Hi, $vārds!"
    };
}

echo pilnsSveiciens("Anna") . "<br>";          // Sveicināts, Anna!
echo pilnsSveiciens("John", "en") . "<br>";    // Hello, John!
echo pilnsSveiciens("Hans", "de") . "<br>";    // Hallo, Hans!
?>

Tipu deklarācijas (Type Declarations)

Teksts
<?php
// PHP 7+ - parametru un atgriešanas vērtību tipi
function dalīt(float $a, float $b): float {
    if ($b == 0) {
        throw new InvalidArgumentException("Nevar dalīt ar 0!");
    }
    return $a / $b;
}

echo dalīt(10, 3) . "<br>"; // 3.333...

// Nullable tipi (? = var būt null)
function atrastLietotāju(int $id): ?array {
    $lietotāji = [
        1 => ["vārds" => "Anna", "loma" => "admin"],
        2 => ["vārds" => "Jānis", "loma" => "user"],
    ];
    return $lietotāji[$id] ?? null; // null, ja nav atrasts
}

$l = atrastLietotāju(1);
$l2 = atrastLietotāju(99);

echo $l ? $l["vārds"] : "Nav atrasts"; echo "<br>"; // Anna
echo $l2 ? $l2["vārds"] : "Nav atrasts"; echo "<br>"; // Nav atrasts

// Union tipi (PHP 8+)
function formatēt(int|float|string $vērtība): string {
    return (string) $vērtība;
}

// mixed - jebkurš tips
function apstrādāt(mixed $dati): mixed {
    return $dati;
}

// void - neatgriež neko
function ierakstīt(string $ziņa): void {
    file_put_contents("log.txt", $ziņa . "\n", FILE_APPEND);
    // return; // Var rakstīt tukšu return, bet ne return vērtību
}
?>

Mainīgs argumentu skaits

Teksts
<?php
// Variadic funkcija (... operators)
function summa(int ...$skaitļi): int {
    return array_sum($skaitļi);
}

echo summa(1, 2, 3) . "<br>";         // 6
echo summa(1, 2, 3, 4, 5) . "<br";    // 15
echo summa(...[10, 20, 30]) . "<br>"; // 60 (spread masīvs)

// Sajaukts - fiksēts + variadic
function vēstule(string $adresāts, string ...$rindas): string {
    $teksts = "Cienītais/ā $adresāts,\n\n";
    foreach ($rindas as $rinda) {
        $teksts .= $rinda . "\n";
    }
    return $teksts . "\nAr cieņu";
}

echo "<pre>" . vēstule("Anna", "Jūsu pieteikums ir saņemts.", "Mēs sazināsimies ar Jums.") . "</pre>";

// func_get_args() - vecākā metode
function vecāMetode(): void {
    $argumenti = func_get_args();
    echo "Argumenti: " . count($argumenti) . "<br>";
    foreach ($argumenti as $a) {
        echo "- $a<br>";
    }
}

vecāMetode("a", "b", "c");
?>

Anonīmās funkcijas un Arrow Functions

Teksts
<?php
// Anonīma funkcija (closure)
$sveiciens = function(string $vārds): string {
    return "Sveicināts, $vārds!";
};

echo $sveiciens("Marta") . "<br>"; // Sveicināts, Marta!

// Pārsūtīt kā argumentu
$skaitļi = [3, 1, 4, 1, 5, 9, 2, 6];

// array_filter ar anonīmu funkciju
$lielāki = array_filter($skaitļi, function($n) {
    return $n > 4;
});
print_r($lielāki); // [5, 9, 6]

// Arrow function (PHP 7.4+) - īsākā forma
// Automātiski "capture" ārējie mainīgie
$lielāki2 = array_filter($skaitļi, fn($n) => $n > 4);

// use - importēt ārējos mainīgos closure
$sliekšnis = 4;
$lielāki3 = array_filter($skaitļi, function($n) use ($sliekšnis) {
    return $n > $sliekšnis;
});

// Callback funkcijas
usort($skaitļi, fn($a, $b) => $a <=> $b);
print_r($skaitļi);

// Izsaukt no masīva
$operācijas = [
    "add" => fn($a, $b) => $a + $b,
    "sub" => fn($a, $b) => $a - $b,
    "mul" => fn($a, $b) => $a * $b,
];

echo $operācijas["add"](10, 5) . "<br>"; // 15
echo $operācijas["mul"](3, 4) . "<br>";  // 12

// Pašizsaucošā funkcija
$rezultāts = (function(int $x): int {
    return $x * $x;
})(7);
echo $rezultāts . "<br>"; // 49
?>

Rekursija

Rekursija ir kad funkcija izsauc pati sevi.

⚠️ Uzmanību ar rekursiju

Rekursijai vienmēr jābūt bāzes gadījumam (apstāšanās nosacījumam), citādi rodas bezgalīga rekursija un PHP kļūda "Maximum function nesting level". PHP noklusējumā atļauj ~100 ligzdošanas līmeņu.

🎓 Ko mācīties tālāk?

Nākamajā sadaļā uzzināsiet, kā apstrādāt HTML formu datus PHP – POST un GET pieprasījumi.

Teksts
<?php
// Faktoriāls
function faktoriāls(int $n): int {
    if ($n <= 1) return 1;            // Bāzes gadījums
    return $n * faktoriāls($n - 1);  // Rekursīvais izsaukums
}

echo faktoriāls(5) . "<br>"; // 120 (5! = 5*4*3*2*1)
echo faktoriāls(10) . "<br>"; // 3628800

// Fibonacci skaitļi
function fibonacci(int $n): int {
    if ($n <= 1) return $n;
    return fibonacci($n - 1) + fibonacci($n - 2);
}

for ($i = 0; $i <= 10; $i++) {
    echo fibonacci($i) . " "; // 0 1 1 2 3 5 8 13 21 34 55
}
echo "<br>";

// Rekursīva mapju struktūras apstrāde
function aprakstītMapi(array $elements, int $dziļums = 0): void {
    foreach ($elements as $atslēga => $vērtība) {
        echo str_repeat("  ", $dziļums) . "- $atslēga<br>";
        if (is_array($vērtība)) {
            aprakstītMapi($vērtība, $dziļums + 1);
        }
    }
}

$struktūra = [
    "src" => [
        "controllers" => [],
        "models" => [],
        "views" => []
    ],
    "public" => [
        "css" => [],
        "js" => []
    ]
];

aprakstītMapi($struktūra);
?>