⚙️ 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.
Funkciju definēšana
<?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)
<?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
<?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
<?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 rekursijuRekursijai 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.
<?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);
?>