PHP Type Casting
13. April 2008 | In: Php
Auch wenn PHP eine typenlose Sprache ist, kann es manchmal sinnvoll sein, genau zu wissen, dass man mit einer Variablen vom Type double arbeitet. Dazu ist es oft notwendig diesen Type explizit zu erzwingen.
PHP selbst führt viele Typeänderungen im Scritpablauf durch. Addiert man auf eine Variable die wie folgt initalisiert wurde $foo = ”; einen Integer Wert $foo += 19;, so wandelt PHP deren Type während dieser Operation von String nach Integer um.
Typen festlegen
Um den Type einer Variablen nach deren Initialisierung zu ändern, nutzt man die Funktion settype( string var, string type). Type kann die folgenden Werte annehmen: integer, double, string, array oder object.
$a = 6; settype( $a, 'double' ); |
Möchte man den Type einer Variablen nicht dauerhaft ändern, sondern nur das Ergebnis, so emphielt sich ein Typecast. Dazu bietet PHP zwei Wege.
Man nutzt eine der Funktionen “doubleval(), intval(), strval(), …”. Will man ein Array oder Object erzwingen, muss man sich dem aus “C”-Zeiten verhassten Syntax bedienen (array), (boolean), (object). Ab PHP 6 kommt noch (binary) hinzu.
/// integer nach array of integer $a = 9; $b = (array)$a; /// integer nach double $c = 2; $d = doubleval( $c ); |
Typen erkennen:
Die Funktion gettype( mixed var ) liefert für die übergebene Variable einen der folgenden Werte:
- integer
- double
- string
- array
- resource
- object
- unknown type
Da der Rückgabewert von gettype() vom Type String ist und sich dessen Wert möglicherweise ändern kann, empfehlen die PHP-Entwickler, diese Funktion nicht zur Erkennung des Types heranzuziehen. Rätselhaft bleibt, wozu diese dann implementiert wurde. Alternativ sollte man eine der folgenden is_XXX() Funktionen nutzen:
- is_array()
- is_bool()
- is_float()
- is_int()
- is_null()
- is_numeric()
- is_object()
- is_resource()
- is_scalar()
- is_string()
Will man eine Variable auf desen Wert und zugleich auf dessen Type prüfen, so nutzt man drei Gleichheitszeichen === bzw. !== um auf ungleich zu testen.
$foo = 1; if( $foo === true ) { print( 1 ); } if( $foo == true ) { print( 2 ); } if( $foo ) { print( 3 ); } |
Test 1 schlägt fehl, da $foo vom Type Integer ist. Test 2 und 3 fallen positiv aus, da PHP den Wert 1 als “true” also Wahr interpretiert.
Eine Detailierte Übersicht zu sämtlichen Type-Tricksereien von PHP gibt es hier: PHP Type juggling, Types Comparosions

5 Kommentare zu PHP Type Casting
Lurki
24. Mai 2008 um 09:53:50
Ich setze Typecasting in PHP häufig ein, um sicher zu gehen, dass eine vom User übertragene Variable definitiv eine Zahl ist. Z.b.:
function verarbeiten($artikelid)
{
$artikelid = (int)$artikelid;
//Mache was damit
}
Ist zwar alleine nicht ausreichend, aber sicher besser als direkt alles anzunehmen :)
Btw: guter Artikel zum Thema!
naden
24. Mai 2008 um 16:29:39
@lurki, ich persönlich nutze $id = intval( $id );, da mit $id = (int)$id; immer an die C und das Typecasting mit Pointern etc. und die dadurch verursachten Fehler erinnert.
Für weiterführende Validierung von Benutzereingaben kann ich dir die KSES Bibliothek empfehlen.
Der “PHP HTML/XHTML”-Filter KSES wird leider nicht mehr weiterentwickelt, leistet mir aber noch immer gute Dienste.
Man kann sehr fein einstellen, was für HTML-Tags erlaubt sind inklusive deren Attribute.
KSES bei Sourceforge
Florian
10. April 2009 um 16:40:36
PHP ist ja auch typisch für Scriptsprachen nicht so typisiert, aber php wandelt es auch automatisch um:
$erg=”4″+”9″; (auch wenn die Zahlen Strings sind)
aber um sicher zu gehen beforzuge ich $erg=(INT)ausdruck.
Bei xml hatte ich Probleme da caste ich oft.
Gruß Florian
Dominik
11. April 2009 um 14:20:22
Hi!
Hier schreibst du: “Möchte man den Type einer Variablen
nicht dauerhaft ändern…”.
Das könnte etwas irreleitend sein. Der Typ wird mit settype() geändert, jedoch nur solange keine neue Zuweisung erfolgt. (Ich beziehe mich hier auf das ‘dauerhaft’.)
Also zum Beispiel:
$x = ‘123′; # $x ist nun string ‘123′
settype($x,’integer’); # $x ist nun int 123
$x = ‘blafasel’; # $x ist wieder string ‘blafasel’
Einen Typ permanent zu erzwingen ist (leider) nicht möglich.
Grüße Dominik
naden
13. April 2009 um 17:02:57
@dominik, ich verstehe deinen Einwand, denke allerdings, dass es im Kontext schon verständlich.
Das man, wenn man die Typen einer Variablen in PHP nicht im Auge behält, mitunter Seiteneffekte erleben kann ist klar.