EMZETT.
Login

Kurz: function gruss(string name = "Welt", string anrede = “Hallo”): string { return “anrede, name!”; }

Teil des Kurses PHP

Kapitel 6 von 15 im Kurs PHP. Mit Fortschritt, Quiz und Zertifikat auf der Lernseite.

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();

Ausgabe:

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";

Ausgabe:

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";

Ausgabe:

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";

Ausgabe:

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";

Ausgabe:

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";

Ausgabe:

bool(true)
bool(true)
abab 9
1,2

Merke

  • function name(Typ $p = std): Rückgabetyp; ...$rest für variable Parameter
  • Benannte Argumente: f(name: "Mia")
  • Funktionen sehen keine äußeren Variablen; use (Closure), fn (automatisch), global/static (selten)
  • &$x übergibt Referenzen
  • yield macht eine Funktion zum Generator
  • declare(strict_types=1); plus Typangaben

Übungsaufgabe

Schreibe histogramm(array $zahlen): array, das zählt, wie oft jede Zahl vorkommt, und eine Funktion, die das mit yield zeilenweise ausgibt.

Quiz zur Selbstkontrolle

Weiter im Kurs

Zurück: Arrays

Weiter: Klassen und Objekte

Alle Kapitel: PHP im Überblick