naden.de Bookmarken

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

Bewertung: najagut
Loading ... Loading ...

Ähnliche Beiträge



5 Kommentare zu PHP Type Casting

Avatar

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!

Avatar

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

Avatar

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

Avatar

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

Avatar

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.

Schreib einen Kommentar

Fülle das Kommentar-Formular vollständig aus oder melde dich über Twitter oder Facebook an.
Sign in with Facebook

By Teledir Internetanbieter