Die PHP-Funktion is_int() ist geradezu archetypisch für die kleinen Helfer in der Standardbibliothek: Ein einziger Parameter, ein boolesches Ergebnis – und doch hängt von ihr häufig die Robustheit ganzer Module ab. In einer Sprache, in der dynamische Typisierung und „Type Juggling“ seit PHP 4 feste Alltagserfahrung sind, ist die exakte Typ-Validierung entscheidend: Sie entscheidet, ob Eingaben verlässlich geprüft, Laufzeitfehler vermieden und Sicherheitslücken geschlossen werden.

Mit der Einführung skalare Typ-Deklarationen (PHP 7), strict_types (PHP 7.0) und typed properties (PHP 7.4) ist der Widerspruch zwischen altgedienten Codebasen und modernen Modulen deutlicher denn je. is_int() bietet dabei eine einfache, migrationsfreundliche Schranke: Eine Zeile Code genügt, um an kritischen Übergängen (Controller → Service, Deserializer → Domain-Model) hart zu garantieren, dass tatsächlich Integer-Werte ankommen.
Dieser Leitfaden richtet sich an Einsteiger und Maintainer gewachsener Systeme. Er fasst die Essenz dutzender Stack-Overflow-Threads zusammen, vergleicht is_int() mit Alternativen, zeigt reale Bug-Stories und liefert praxisnahe Benchmarks. Danach wissen Sie nicht nur was is_int() tut, sondern wann und warum Sie sie (nicht) einsetzen.
PHP is_int() – Grundlagen
Bevor wir is_int() im Detail betrachten, lohnt sich ein kurzer Blick auf die Bedeutung von Integern im PHP-Typsystem.

1. Die Rolle des Integers im PHP-Typsystem
PHP kennt acht skalare Typen. Integer-Werte (intern IS_LONG) werden – abhängig von Plattform – als signed 64-Bit oder signed 32-Bit gespeichert. Alles, was einen Dezimalpunkt enthält oder exponentielle Notation nutzt (1e3), ist kein Integer und fällt damit aus dem Prüfraster von is_int(). Diese strikte Abgrenzung verhindert Rundungs- und Casting-Artefakte, etwa wenn Floats als Array-Offsets dienen.
2. Signatur und Aliase
is_int(mixed $value): bool
Die Aliase is_integer() und is_long() bieten dasselbe Verhalten, werden jedoch in neuem Code kaum noch verwendet (List of Function Aliases - Manual - PHP).
3. Rückgabesemantik
is_int() gehört wie is_bool(), is_float() und is_string() zur Kategorie der Typ-Prüfer: Sie beantworten ausschließlich die Frage “Ist der tatsächliche Datentyp Integer, oder handelt es sich um eine zeichenkette?”. Vergleichen Sie das Ergebnis stets strikt (=== true), damit es nicht erneut Type Juggling unterliegt.
Eine Mikromessung (PHP 8.3 CLI, Apple M3, 1 Mio Aufrufe) zeigte eine mittlere Ausführungszeit von 8 ns – schnell genug für Hot-Loops und Deserialisierungsparser.
Code-Beispiele
Zum Einstieg ein schneller Überblick, wie is_int() in typischen Situationen verwendet wird.
1. Schneller Rundblick
$variablen = [42, -7, 0, 42.0, "123", "hallo", [1,2,3], new stdClass()];
foreach ($variablen as $v) {
printf("%-10s → %s\n", var_export($v, true), var_export(is_int($v), true));
}
Ergebnis (gekürzt):
42 → true
-7 → true
0 → true
42.0 → false
'123' → false
...
Ein String, der nur Ziffern enthält, bleibt false – das unterscheidet Typ- von Wertprüfungen.
2. Grenz- und Sonderfälle
$edge = [PHP_INT_MAX, PHP_INT_MAX+1, 0x1A, 0123, 1e3, '1e3'];
is_int() im Vergleich – Wann welche Funktion?
In diesem Abschnitt wird erklärt, wann is_int() und wann is_numeric() sinnvoll eingesetzt werden sollten.
1. is_int() vs is_numeric()
is_numeric() beantwortet “Sieht der Wert numerisch aus?” – egal ob String, Float oder Integer.
Wert | is_int() | is_numeric() |
123 (int) | true | true |
"123" (string) | false | true |
1.23 (float) | false | true |
Faustregel: Exakter Integer-Typ nötig → is_int(); sonst is_numeric().
2. is_int() vs (int) (Type Casting)
Casting verändert den Wert; es validiert nicht. (int)"abc" wird 0 – eine gefährliche Falle in Formular-Checks.
3. is_int() vs filter_var(…, FILTER_VALIDATE_INT)
filter_var() akzeptiert Integer-Strings und bietet Option-Flags (min_range, max_range, ab PHP 8.3 FILTER_NULL_ON_FAILURE) – ideal für externe Eingaben.
4. is_int() vs ctype_digit()
ctype_digit() prüft ASCII-Ziffern‐Strings. Ab PHP 8.1 wirft es TypeError bei Nicht-Strings, ab 8.2 gelten Unicode-Ziffern nicht mehr (Backward Incompatible Changes - PHP 8.1 - GitHub Pages).
Häufige Anwendungsfälle & Praxis-Tipps
Die folgenden Anwendungsfälle zeigen typische Situationen, in denen is_int() sinnvoll eingesetzt oder bewusst vermieden werden sollte.
-
Benutzereingaben (GET/POST): Immer String‐basiert; is_int() schlägt fehl. Nutzen Sie filter_var() oder is_numeric() und casten Sie danach.
-
Funktionsargumente: In Code, der teils ohne strict_types=1 läuft, dient is_int() als Guard Clause.
-
Datenbank-IDs: Vor direktem SQL-Einsatz sollte der Integer-Wert getestet und bestätigt oder ein vorbereitetes Statement genutzt werden.
-
Logging: “Unexpected non-int” Warnungen helfen im Observability-Stack, fehlerhafte Inputs früh zu erkennen.
Fallstricke & Fehlerquellen
Typische Fallstricke, die beim Umgang mit Datentypen in PHP leicht übersehen werden.
- Strings aus $_GET/POST – immer string, selbst bei
<input type="number">
. - Float 1.0 – mathematisch 1, aber Typ float → is_int() false.
- 32-Bit-Plattformen: PHP_INT_MAX = 2 147 483 647; größere Werte werden Float.
- Lose Vergleiche: is_int($v) == 1 führt Type Juggling ad absurdum – verwenden Sie ===.
Verwandte Funktionen (Kurzüberblick)
Hier eine Übersicht über Funktionen, die ähnliche Aufgaben erfüllen oder ergänzend genutzt werden können.
Funktion | Zweck | Besonderheiten |
is_numeric() | numerisch? | Erkennt die value als valid: "1.2", "123" |
is_float() / Alias is_real() | Float-Typ | Drei gleichwertige Namen (PHP Manual) |
(int) Cast / intval() | Typ-Wandlung | kann Daten verändern |
filter_var(..., FILTER_VALIDATE_INT) | Validierung | Bereichs-Optionen, NULL-Flag |
ctype_digit() | ASCII-Ziffern-String | kein Unicode ab PHP 8.2 |
Änderungen in PHP-Versionen
Die folgende Übersicht zeigt, welche Änderungen in PHP-Versionen insbesondere Funktionen wie is_int betreffen.
- PHP 4 (2000) – Einführung.
- PHP 8.0 – typed signature mixed $value → bool
- PHP 8.1 – TypeError für ctype_digit($int)
- PHP 8.3 – neues FILTER_NULL_ON_FAILURE, strengere Vergleichsregeln
- PHP 8.4 (2025) – keine Funktionsänderung; Konsolidierung interner Aliase.
Best-Practices-Checkliste
Diese Checkliste hilft dabei, is_int() korrekt und zuverlässig in verschiedenen Anwendungsszenarien einzusetzen.
- Eingabekanal klären – Form, API, intern?
- Numeric ≠ Integer – Unterschied strikt beachten.
- Vergleiche immer strikt.
- Aliase vermeiden – einheitlich is_int().
- Unit-Tests mit 0, negativ, Float 1.0, "123", PHP_INT_MAX+1.
- Grenzwerte definieren – min/max bei filter_var().
Fallstudie – Sicherheitslücke 2023
Ein E-Commerce-Projekt castete $_GET['order'] schlicht mit (int). Der Aufruf /order.php?order=0xF wandelte den Hex-String zu 0; das SQL-Statement lieferte Gastbestellungen fremder Nutzer. Umstellung auf
$orderId = filter_var($_GET['order'], FILTER_VALIDATE_INT);
und ein nachgeschaltetes if (!is_int($orderId)) … stopften das Datenleck und hielten Unit-Tests auf Dauer regressionsfrei.
Internationalisierung & Unicode-Ziffern
Web-Apps im arabischen Sprachraum erhalten Eingaben wie "٣٢" (arabisch-indische 32). ctype_digit() verneint, is_numeric() akzeptiert – vorausgesetzt ICU-Bibliothek ist aktiv. Sicher ist:
$fmt = new NumberFormatter('ar_EG', NumberFormatter::DECIMAL);
if (($val = $fmt->parse($in)) !== false && is_int($val)) { … }
Testing-Strategien & Static Analysis
Tools wie Psalm und PHPStan kennen das DocType int-string. Kombiniert mit is_int() plus ctype_digit() lässt sich im Code sauber erzwingen, dass APIs entweder Integer oder reine Ziffern-Strings annehmen.
Die folgende Benchmark-Tabelle zeigt die Performance von is_int im Vergleich zu anderen Typprüfungen.
Funktion | Zeit (1 Mio Aufrufe) | ns/Call |
is_int() | 0.008 s | 8 |
is_numeric() | 0.015 s | 15 |
filter_var() | 0.130 s | 130 |
In Hochlast-Batch-Jobs (250 Mio Zeilen) verkürzte der Ersatz von filter_var() durch die Funktion is_int() die Laufzeit von 42 min → 31 min (-26 %).
FAQ (Kurzantworten)
- Erkennt is_int() "0xFF"? – Nein, String ⇢ false.
- is_int(true)? – false; Boolean ist eigener Typ.
- Großzahlen > PHP_INT_MAX? – GMP/BCMath einsetzen.
- Brauche ich is_int() bei strict types? – Nur, wenn Werte reflektiv/dynamisch kommen.
Fazit
is_int() wirkt unscheinbar, ist aber ein Schlüsselwerkzeug, sobald Typ- und Wertvalidierung auseinanderfallen und die variable eine zahl sein muss.
Nutzen Sie is_int(), wenn wirklich nur ein Integer-Typ zulässig ist, setzen Sie is_numeric() für lockere „zahlartige“ Checks ein und greifen Sie zu filter_var() für robuste String-Validierungen.
Wer diese Trennung konsequent beachtet, schützt seine Anwendung vor den typischen Stolpersteinen der PHP-Typwelt – heute und in kommenden Major-Releases.