Funktionen definieren
<?php
declare(strict_types=1);
function gruss(string $name = "Welt", string $anrede = "Hallo"): string
{
return "$anrede, $name!";
}
function summe(int ...$zahlen): int // variable Parameteranzahl
{
return array_sum($zahlen);
}
function minmax(array $z): array
{
return [min($z), max($z)];
}
function nichts(): void { echo "kein Rückgabewert\n"; }
echo gruss(), " ", gruss("Mia"), " ", gruss(anrede: "Hi", name: "Tom"), "\n"; // benannte Argumente
echo summe(1, 2, 3), " ", summe(...[4, 5]), "\n";
[$klein, $gross] = minmax([4, 9, 1]);
echo "$klein $gross\n";
nichts();Hallo, Welt! Hallo, Mia! Hi, Tom! 6 9 1 9 kein Rückgabewert
Typen für Parameter und Rückgabe (int, string, ?int für "oder null", int|string als Union, void, never, mixed) machen Code sicherer und selbstdokumentierend.
Gültigkeitsbereich
Funktionen sehen keine globalen Variablen:
<?php
$global = "außen";
function test() {
echo isset($global) ? "sichtbar" : "nicht sichtbar", "\n";
}
test();
function zugriff() {
global $global; // möglich, aber selten gut
return $global;
}
echo zugriff(), "\n";
function zaehler() {
static $n = 0; // bleibt zwischen Aufrufen erhalten
return ++$n;
}
echo zaehler(), zaehler(), zaehler(), "\n";nicht sichtbar außen 123
Referenzen und Werte
Standardmäßig werden Argumente kopiert. Mit & übergibst du eine Referenz:
<?php
function erhoehe(int $x) { $x++; }
function erhoehe_ref(int &$x) { $x++; }
$a = 5;
erhoehe($a); echo $a, " ";
erhoehe_ref($a); echo $a, "\n";
function add_item(array &$liste, $item): void { $liste[] = $item; }
$l = [];
add_item($l, "x"); add_item($l, "y");
echo implode(",", $l), "\n";5 6 x,y
Anonyme Funktionen und Pfeilfunktionen
<?php
$quadrat = function (int $x): int { return $x * $x; };
$kurz = fn(int $x): int => $x * $x; // Pfeilfunktion: sieht äußere Variablen automatisch
$faktor = 3;
$mal = fn($x) => $x * $faktor;
$zaehler = 0;
$inc = function () use (&$zaehler) { $zaehler++; }; // use: Variable einfangen (hier per Referenz)
$inc(); $inc();
echo $quadrat(4), " ", $kurz(5), " ", $mal(7), " ", $zaehler, "\n";
function wende_an(callable $f, array $liste): array { return array_map($f, $liste); }
echo implode(",", wende_an('strtoupper', ["a", "b"])), " ", implode(",", wende_an(fn($x) => $x + 1, [1, 2])), "\n";
$strlen = strlen(...); // First-class callable (8.1)
echo $strlen("Hallo"), "\n";
function multiplikator(int $f): Closure { return fn($x) => $x * $f; }
$mal5 = multiplikator(5);
echo $mal5(6), "\n";16 25 21 2 A,B 2,3 5 30
Rekursion und Generatoren
<?php
function fakultaet(int $n): int { return $n <= 1 ? 1 : $n * fakultaet($n - 1); }
function fib(int $n): int { return $n < 2 ? $n : fib($n - 1) + fib($n - 2); }
echo fakultaet(10), " ", fib(15), "\n";
function zaehle(int $bis): Generator // yield liefert Werte nach und nach (spart Speicher)
{
for ($i = 1; $i <= $bis; $i++) {
yield $i => $i * $i;
}
}
foreach (zaehle(4) as $zahl => $quadrat) echo "$zahl^2=$quadrat ";
echo "\n";
function alle_geraden(): Generator { $i = 0; while (true) { yield $i; $i += 2; } }
foreach (alle_geraden() as $g) { if ($g > 8) break; echo $g, " "; }
echo "\n";3628800 610 1^2=1 2^2=4 3^2=9 4^2=16 0 2 4 6 8
Eingebaute Helfer
<?php
var_dump(function_exists("strlen"), is_callable("strlen"));
echo call_user_func("str_repeat", "ab", 2), " ", call_user_func_array("max", [3, 9, 4]), "\n";
echo implode(",", array_map("intval", ["1", "2x"])), "\n";bool(true) bool(true) abab 9 1,2
Merke
function name(Typ $p = std): Rückgabetyp;...$restfür variable Parameter- Benannte Argumente:
f(name: "Mia") - Funktionen sehen keine äußeren Variablen;
use(Closure),fn(automatisch),global/static(selten) &$xübergibt Referenzenyieldmacht eine Funktion zum Generatordeclare(strict_types=1);plus Typangaben
Aufgabe
Schreibe histogramm(array $zahlen): array, das zählt, wie oft jede Zahl vorkommt, und eine Funktion, die das mit yield zeilenweise ausgibt.