Menu

PHP Interview Fragen und Antworten (PHP 8)

24 PHP-Interviewfragen mit kurzen, korrekten Antworten für PHP 8, von == vs === und isset vs empty bis zu Referenzen in foreach, self vs static, Generatoren, SQL-Injection und Passwort-Hashing. Die meisten Antworten haben Code, den du ausführen und ändern kannst.

Diese Seite enthält ausführbare Editoren - bearbeiten, ausführen und Ausgabe sofort sehen.

Das sind die PHP-Fragen, die in Interviews am häufigsten vorkommen, mit kurzen Antworten, die für PHP 8.3 korrekt sind, und Code, wo Code den Punkt macht. Sag die Ausgabe jedes Blocks voraus, bevor du auf Run klickst: Genau das testet ein Interviewer.

PHP-Interviewfragen für Einsteiger

Was ist PHP und wie läuft es?

PHP ist eine serverseitige Skriptsprache. Ein Webserver (Nginx oder Apache) gibt die Anfrage an PHP weiter (meist PHP-FPM), PHP führt das Skript von oben aus, und was es ausgibt, wird zur Antwort, meist HTML. Jede Anfrage beginnt frisch: Variablen überleben nicht zwischen Anfragen, außer du speicherst sie in einer Session, einer Datenbank oder einem Cache. PHP führt Skripte auch auf der Kommandozeile aus (php script.php).

Was ist der Unterschied zwischen == und ===?

== vergleicht nach einer Typumwandlung, === vergleicht Wert und Typ ohne Umwandlung. Das Aufwärmbeispiel oben zeigt == bei der Arbeit: Numerische Strings werden als Zahlen verglichen, also ist '10' == '1e1' gleich true. Seit PHP 8 wird eine Zahl, die mit einem nicht numerischen String verglichen wird, als String verglichen, also ist 0 == 'a' gleich false (in PHP 7 war es true). Tippe auf die Zellen, um beide Operatoren zu vergleichen:

Lockerer (==) und strikter (===) Vergleich
Point at or tap a cell to read it as PHP.
$a == $btruefalse01"0""1"""null[]"a""10""1e1"
true
false
0
1
"0"
"1"
""
null
[]
"a"
"10"
"1e1"
Every cell computed by PHP 8.3.19.

Verwende standardmäßig ===. in_array() und array_search() verwenden ==, außer du übergibst true als drittes Argument.

Was ist der Unterschied zwischen echo und print?

Beide geben Strings aus. echo nimmt mehrere Argumente (echo $a, $b;) und liefert nichts; print nimmt eines und liefert 1, kann also in einem Ausdruck stehen. Keines von beiden ist eine Funktion, also sind Klammern optional. In der Praxis verwenden alle echo.

Einfache vs doppelte Anführungszeichen?

Strings in doppelten Anführungszeichen interpolieren Variablen und Escape-Sequenzen: "Hi $name\n". Strings in einfachen Anführungszeichen sind wörtlich, außer \' und \\: 'Hi $name\n' gibt genau diese Zeichen aus. Der Geschwindigkeitsunterschied ist vernachlässigbar, also geht es um Lesbarkeit: doppelte Anführungszeichen, wenn du interpolierst, einfache, wenn nicht.

Welche Datentypen gibt es in PHP?

Vier skalare Typen (int, float, string, bool), zwei zusammengesetzte (array und object) und zwei besondere (null und resource). callable, iterable, mixed und void gibt es nur als Typdeklarationen, nie als Typ eines Werts. gettype() und get_debug_type() nennen dir zur Laufzeit den Typ eines Werts, und var_dump() gibt ihn mit dem Wert aus.

Was ist der Unterschied zwischen isset, empty und is_null?

isset($x) ist true, wenn die Variable existiert und nicht null ist. empty($x) ist true, wenn die Variable nicht existiert oder falsy ist (0, '0', '', [], false, null). is_null($x) ist true bei null, warnt aber bei einer undefinierten Variable. isset und empty warnen nie, und deshalb verwendet man sie bei Array-Schlüsseln.

isset, empty und is_null für jeden Wert von $x
Point at or tap a cell to read it as PHP.
$xissetemptyis_null
null
false
0
"0"
""
" "
[]
"a"
0.0
Every cell computed by PHP 8.3.19.

Die Zeile, die viele falsch beantworten, ist "0": Der String null ist leer, während " " (ein Leerzeichen) es nicht ist. Die Seite zu isset hat die vollständige Tabelle.

Was ist der Unterschied zwischen include und require?

Beide fügen eine andere Datei ein und führen sie aus. Fehlt die Datei, gibt include eine Warnung aus und das Skript läuft weiter, während require einen Error wirft („Failed opening required“), der das Skript stoppt, außer etwas fängt ihn ab. Die Varianten _once (include_once, require_once) überspringen eine Datei, die schon geladen wurde, was Fehler wie „cannot redeclare function“ verhindert. Verwende require (oder require_once) für Dateien, ohne die das Skript nicht laufen kann, also fast alle; der Autoloader von Composer macht die meisten manuellen Includes überflüssig.

Was ist der Unterschied zwischen GET und POST?

GET sendet Daten im Query-String der URL ($_GET), sie sind also sichtbar, als Lesezeichen speicherbar und in der Länge begrenzt; verwende es zum Lesen, etwa für Suche und Seitenaufteilung. POST sendet Daten im Request-Body ($_POST); verwende es für alles, was einen Zustand ändert, etwa Login, Speichern oder Zahlungen. Eine GET-Anfrage sollte nie Daten ändern, weil Links vorab geladen und gecrawlt werden.

Was ist der Null-Coalescing-Operator?

$a ?? $b liefert $a, wenn es existiert und nicht null ist, sonst $b, ohne Warnung bei einer undefinierten Variable oder einem undefinierten Schlüssel: $page = $_GET['page'] ?? 1;. ??= weist nur zu, wenn die linke Seite null ist oder fehlt. Es unterscheidet sich von ?:, das bei jedem falsy Wert zurückfällt, also ist 0 ?: 5 gleich 5, aber 0 ?? 5 gleich 0.

PHP-Interviewfragen für Fortgeschrittene

Was passiert, wenn du in foreach per Referenz iterierst?

foreach ($arr as &$v) erlaubt es, Elemente direkt zu ändern, aber $v bleibt nach der Schleife eine Referenz auf das letzte Element. Den Namen in einer zweiten Schleife wiederzuverwenden überschreibt dann dieses Element:

Das letzte Element ist 20, nicht 30: Während der zweiten Schleife bekommt $v (immer noch $arr[2]) nacheinander 10, dann 20, dann sich selbst zugewiesen. Entferne das // vor unset($v) und führe den Code erneut aus. Die Seite zu foreach behandelt Referenzen im Detail.

Was ist der Unterschied zwischen einer abstrakten Klasse und einem Interface? Und was ist ein Trait?

Ein Interface ist ein Vertrag: Methodensignaturen (und Konstanten) ohne Implementierung, und eine Klasse kann viele implementieren. Eine abstrakte Klasse kann Eigenschaften, Konstruktoren und fertige Methoden enthalten, dazu abstrakte Methoden, die ihre Kinder schreiben müssen; eine Klasse erweitert nur eine. Ein Trait ist eine Gruppe von Methoden, die mit use in eine Klasse kopiert wird, um Code zwischen Klassen wiederzuverwenden, die keine gemeinsame Elternklasse haben.

Eine kurze Antwort, die Interviewer mögen: Verwende ein Interface, um zu sagen, was etwas kann, eine abstrakte Klasse, um zu teilen, wie es gemacht wird, und einen Trait, wenn nicht verwandte Klassen dieselben paar Methoden brauchen.

Was ist der Unterschied zwischen self und static?

self verweist auf die Klasse, in der der Code steht. static verweist auf die Klasse, die zur Laufzeit tatsächlich aufgerufen wurde; das nennt man Late Static Binding. Es zählt in Methoden der Elternklasse, die „diese Art von Objekt“ erzeugen oder beschreiben:

User::createStatic() baut einen User. User::createSelf() baut ein Model, was den Rückgabetyp static verletzt, also wirft PHP einen TypeError. Deshalb verwenden Factory-Methoden new static().

Was sind magische Methoden?

Methoden, die PHP für dich aufruft, alle beginnen mit zwei Unterstrichen. Die gängigen: __construct(), wenn ein Objekt erzeugt wird, __destruct(), wenn es zerstört wird, __toString(), wenn es als String verwendet wird, __get() und __set() für unzugängliche Eigenschaften, __call() und __callStatic() für fehlende Methoden, __invoke(), wenn das Objekt wie eine Funktion aufgerufen wird, und __clone() nach clone.

Was ist der Unterschied zwischen array_merge() und dem Operator +?

array_merge() hängt an: Numerische Schlüssel werden neu nummeriert, und spätere String-Schlüssel überschreiben frühere. + ist eine Vereinigung: Es behält das linke Array und fügt nur fehlende Schlüssel hinzu, also gewinnt bei einem doppelten Schlüssel der erste Wert.

+ ist das richtige Werkzeug für Standardwerte: $options + ['timeout' => 30] behält, was der Aufrufer übergeben hat, und füllt den Rest auf.

Was macht declare(strict_types=1)?

Ohne wandelt PHP skalare Argumente in den deklarierten Parametertyp um, wenn es kann: "5" an einen int-Parameter zu übergeben ergibt 5. Mit declare(strict_types=1); als erster Anweisung einer Datei müssen Aufrufe aus dieser Datei genau den Typ übergeben, sonst wird ein TypeError geworfen (ein int an einen float-Parameter ist die einzige erlaubte Erweiterung).

Lösche die Zeile mit declare und führe den Code erneut aus: Der zweite Aufruf liefert 10, statt zu werfen.

Ein Cookie wird im Browser gespeichert und mit jeder Anfrage gesendet, also kann der Besucher es lesen und ändern. Eine Session speichert Daten auf dem Server und hält nur eine zufällige ID in einem Cookie (PHPSESSID). Leg alles, dem vertraut werden muss, etwa die ID des angemeldeten Nutzers, in $_SESSION ab; rufe nach dem Login session_regenerate_id(true) auf. Die Seite zu Sessions und Cookies hat den Code.

Wie verhinderst du SQL-Injection?

Bau SQL nie durch Verketten von Eingaben. Verwende Prepared Statements, damit Werte getrennt von der Abfrage gesendet werden:

<?php
$stmt = $pdo->prepare('SELECT * FROM users WHERE email = ?');
$stmt->execute([$email]);
$user = $stmt->fetch();

Platzhalter funktionieren nur für Werte. Tabellennamen, Spaltennamen und ASC/DESC müssen gegen eine Liste erlaubter Werte geprüft werden, bevor sie ins SQL kommen. Siehe PDO.

Wie verhinderst du XSS?

Escape die Ausgabe, nicht die Eingabe: Pack jeden Wert, der in HTML ausgegeben wird, in htmlspecialchars($value, ENT_QUOTES, 'UTF-8') oder verwende eine Template-Engine, die das automatisch macht (Twig, Blade). In <script> verwendest du json_encode() mit JSON_HEX_TAG. Füge als zweite Ebene einen Header Content-Security-Policy hinzu.

Wie sollten Passwörter gespeichert werden?

Mit password_hash($password, PASSWORD_DEFAULT) und geprüft mit password_verify($password, $hash). Sie verwenden bcrypt (oder Argon2id) mit einem zufälligen Salt im Hash und einer absichtlichen Cost. md5() und sha1() sind für Passwörter falsch, weil sie schnell sind und kein Salt haben. Verwende beim Login password_needs_rehash(), um alte Hashes zu aktualisieren.

PHP-Interviewfragen für Profis

Was sind Generatoren und wann würdest du einen verwenden?

Eine Funktion mit yield liefert einen Generator, der Werte einzeln erzeugt, nur wenn danach gefragt wird. Damit läufst du über eine große oder endlose Folge, ohne ein Array im Speicher aufzubauen:

Typische Einsätze sind eine große Datei Zeile für Zeile lesen, Datenbankzeilen streamen und lazy Pipelines. Generatoren unterstützen außerdem Schlüssel (yield $key => $value), Delegation (yield from) und das Empfangen von Werten mit send().

Was sind Closures, und was macht use?

Eine anonyme Funktion (function () { ... }) ist ein Closure-Objekt. Sie sieht äußere Variablen nur, wenn du sie in use aufführst, das den Wert in dem Moment kopiert, in dem die Closure erzeugt wird; use (&$x) fängt stattdessen per Referenz ein. Arrow Functions (fn ($x) => $x * $factor) fangen äußere Variablen automatisch ein, als Wert, und enthalten einen einzigen Ausdruck.

Was ist der Unterschied zwischen abstract, final und readonly?

abstract markiert eine Klasse, die sich nicht instanziieren lässt, oder eine Methode, die ein Kind implementieren muss. final verbietet das Überschreiben einer Methode oder das Erweitern einer Klasse. readonly (PHP 8.1) macht eine Eigenschaft nur einmal beschreibbar, aus der Klasse heraus, meist im Konstruktor; PHP 8.2 brachte readonly-Klassen, in denen jede Eigenschaft readonly ist.

Was ist Composer, und was ist PSR-4?

Composer ist der Abhängigkeitsmanager von PHP: composer.json listet die Pakete auf, composer.lock legt genaue Versionen fest, und vendor/autoload.php lädt alles. PSR-4 ist der Autoloading-Standard, der ein Namespace-Präfix einem Ordner zuordnet, sodass App\Mail\Mailer in src/Mail/Mailer.php liegt und beim ersten Gebrauch geladen wird. Erkläre install (aus der Lock-Datei) gegenüber update (neue Versionen, neue Lock-Datei).

Was hat sich in PHP 8 geändert?

Die wichtigsten Features: in 8.0 benannte Argumente, match, der Nullsafe-Operator ?->, Union Types, Constructor Property Promotion, Attribute, str_contains() und ein vernünftigerer Vergleich von Strings mit Zahlen; in 8.1 Enums, readonly-Eigenschaften, die First-Class-Callable-Syntax (strlen(...)) und Fibers; in 8.2 readonly-Klassen und eigenständige Typen null/true/false; in 8.3 typisierte Klassenkonstanten, das Attribut #[\Override] und json_validate(); in 8.4 Property Hooks, asymmetrische Sichtbarkeit (public private(set)), array_find() und new Foo()->method() ohne umschließende Klammern. Viele Funktionen werfen außerdem jetzt TypeError oder ValueError, statt mit einer Warnung false zu liefern.

Wie verwaltet PHP Speicher?

Jeder Wert hat einen Referenzzähler; fällt er auf null, wird der Speicher sofort freigegeben. Objekte, die in einem Zyklus aufeinander verweisen, erreichen nie null, also läuft ein Zyklus-Sammler, sobald sein Puffer möglicher Zykluswurzeln voll ist (standardmäßig 10.000 Einträge), und gibt sie frei (gc_collect_cycles() startet ihn auf Abruf). Arrays und Strings sind Copy-on-Write: $b = $a teilt die Daten, bis einer von beiden geändert wird. Weil jede Anfrage sauber beginnt und endet, zählen Speicherlecks vor allem bei lang laufenden Workern und Queue-Consumern.

Wie sind PHP-Arrays implementiert?

Ein PHP-Array ist eine geordnete Hash-Map: Es behält die Einfügereihenfolge und ordnet Schlüssel vom Typ int oder string Werten zu, und deshalb dient derselbe Typ als Liste, Dictionary und Stack. Zugriffe über Schlüssel (isset($arr[$key])) brauchen im Schnitt konstante Zeit, während in_array() jeden Wert durchsucht. Ganzzahlartige String-Schlüssel werden umgewandelt: $a['1'] und $a[1] sind dasselbe Element.

Typische Programmieraufgaben im Interview

Kurze Übungen, die oft live gestellt werden. Jede Funktion ist eine übliche Antwort; führe sie aus, füge eigene Eingaben hinzu (auch eine leere) und sei bereit, die Zeitkomplexität zu erklären, denn die prüft der Interviewer meistens.

Häufig gestellte Fragen

Wie bereite ich mich auf ein Interview als PHP-Entwickler vor?

Stell sicher, dass du die Grundlagen erklären und ohne Nachschlagen Code dafür schreiben kannst: Vergleiche und Typen, Arrays und ihre Funktionen, OOP (Interfaces, abstrakte Klassen, Traits, static), Exceptions und Sicherheit (Prepared Statements, htmlspecialchars, password_hash). Kenne dann ein Framework (Laravel oder Symfony) und Composer gut genug, um durch ein Projekt zu führen, das du gebaut hast.

Welche PHP-Version sollte ich für ein Interview kennen?

PHP 8. Interviewer erwarten, dass du die Features aus 8.0 bis 8.3 kennst: benannte Argumente, match, den Nullsafe-Operator ?->, Union Types, Constructor Property Promotion, Enums, readonly-Eigenschaften und die First-Class-Callable-Syntax. Erwähne das Verhalten von PHP 7 nur dort, wo es sich geändert hat, etwa bei 0 == "a".

Welche PHP-Fragen werden Einsteigern gestellt?

Meist die Grundlagen der Sprache: == vs ===, echo vs print, einfache vs doppelte Anführungszeichen, isset vs empty, include vs require, GET vs POST, Sessions vs Cookies und einfache Array-Aufgaben wie Umdrehen, Filtern oder Werte zählen. Rechne mit mindestens einer kurzen Programmieraufgabe.

Welche PHP-Fragen werden erfahrenen Entwicklern gestellt?

Design und Verhalten unter der Haube: Interfaces vs abstrakte Klassen, Traits, Late Static Binding, Referenzen, Generatoren und Speicher, Exceptions und Fehlerbehandlung, SQL-Injection und Transaktionen, Caching, Composer-Autoloading und wie du ein Feature strukturieren oder testen würdest. Von den Antworten werden Abwägungen erwartet, keine Definitionen.

Illustration der Programmiersprachen bei Coddy

Lerne mit Coddy zu programmieren

LOS GEHT'S