Type Casts (Thema: PHP Beispiele)

Verwendung von Type Casts in PHP, wie sich die einzelnen Datentypen dabei verhalten und Hinweise zum Type-Casting von Objekten

1. Erläuterungen

Als Type Cast wird die Umwandlung einer Variable eines Datentyps A in einen anderen Datentyp B bezeichnet. Zum Beispiel wäre die Umwandlung einer Integer-Variable in eine Float-Variable ein Type Cast. PHP unterstützt Type Casts in erster Linie für primitive Datentypen (Integer, Float, Boolean, ...) und ist in diesem Bereich sehr tolerant, sodass etwa Strings in Integer umgewandelt werden können. Im Gegensatz zu Java werden allerdings keine Type Casts von einer Klasse A zu einer anderen Klasse B unterstützt — auch nicht, wenn A von B erbt.

Um einen Type Cast durchzuführen muss der neue Datentyp in Klammern vor die Variable geschrieben werden: (neuer_datentyp)$variable. Folgende Casts sind möglich:

  • (int) und (integer): Umwandlung in Integer.
  • (float), (double) und (real): Umwandlung in Float.
  • (string): Umwandlung in String.
  • (bool) und (boolean): Umwandlung in Boolean.
  • (array): Umwandlung in ein Array. Bei Anwendung auf eine Variable wird zumeist ein Array erzeugt, welches wiederum die Variable als einzigen Wert enthält.
  • (object): Umwandlung in ein Objekt der Klasse stdClass. Bei Anwendung auf Float, Integer, String oder Boolean hat das sich ergebende Objekt ein Feld mit Namen „scalar”, welches die Variable enthält. Bei Anwendung auf ein Array oder auf NULL wird ein stdClass-Objekt ohne Felder erzeugt. Bei Anwendung auf ein Objekt bleibt das Objekt unverändert.
  • (unset): Setzt die Variable auf NULL, ist also identisch mit $variable = null;
  • (binary): Umwandlung von Strings in Binärstrings.

2. Beispiel: Type Cast von Integer zu Float bzw. (float)

In diesem Beispiel wird eine Variable vom Typ Integer in eine Float-Variable umgewandelt.

PHP-Code
<?php
	$a = 100;
	$b = (float)$a;
	var_dump($a, $b);
?>

HTML-Code: Ausgabe
int(100)
float(100)


3. Beispiel: Type Cast von String zu Integer bzw. (int)

In diesem Beispiel wird eine Variable vom Typ String in einen Integer umgewandelt.

PHP-Code
<?php
	$a = '100';
	$b = (int)$a;
	var_dump($a, $b);
?>

HTML-Code: Ausgabe
string(3) "100"
int(100)


Bei der Umwandlung von String zu Integer werden alle Zahlen am Anfang des Strings bis zum ersten Zeichen, das nicht im Bereich 0 bis 9 liegt, übernommen.

PHP-Code
<?php
	$a = '15abc'; // hiervon wird die 15 uebernommen
	$b = 'abc15'; // hiervon wird nichts uebernommen
	var_dump((int)$a, (int)$b);
?>

HTML-Code: Ausgabe
int(15)
int(0)


4. Beispiel: Type Cast von Integer zu Boolean bzw. (bool)

Umwandlung von Integer-Werten in Boolean. Die Zahl 0 wird als false interpretiert, alle anderen Werte als true.

PHP-Code
<?php
	$a = 0;
	$b = 1;
	$c = 2;
	$d = -1;
	var_dump((bool)$a, (bool)$b, (bool)$c, (bool)$d);
?>

HTML-Code: Ausgabe
bool(false)
bool(true)
bool(true)
bool(true)


5. Beispiel: Type Cast von Float zu String bzw. (string)

Darstellung der Konvertierung von Float nach String. Will man die Nachkommastellen nicht haben, muss round($var, $precision) verwendet werden, wobei $precision der Anzahl der Nachkommastellen entspricht.

PHP-Code
<?php
	$a = 1/3;
	$b = (string)$a;
	var_dump($a, $b);
?>

HTML-Code: Ausgabe
float(0.33333333333333)
string(16) "0.33333333333333"


6. Beispiel: Type Cast von Float zu Array bzw. (array)

Umwandlung eines Float-Werts in ein Array. Es wird dabei ein Array erzeugt, welches als einziges Element den Float-Wert enthält.

PHP-Code
<?php
	$a = 9.999;
	$b = (array)$a;
	var_dump($a, $b);
?>

HTML-Code: Ausgabe
float(9.999)
array(1) {
  [0]=>
  float(9.999)
}


7. Beispiel: Type Cast von String zu NULL bzw. (unset)

Umwandlung von String zu NULL, identisch mit $a = null.

PHP-Code
<?php
	$a = 'example';
	$b = (unset)$a;
	var_dump($a, $b);
?>

HTML-Code: Ausgabe
string(7) "example"
NULL


8. Beispiel: Type Cast von String zu Object bzw. (object)

In diesem Beispiel wird ein String in ein Objekt der Klasse stdClass umgewandelt.

PHP-Code
<?php
	$a = 'example';
	$b = (object)$a;
	var_dump($a, $b);
?>

HTML-Code: Ausgabe
string(7) "example"
object(stdClass)#1 (1) {
  ["scalar"]=>
  string(7) "example"
}


9. Beispiel: Type Cast von String zu Binärstring

PHP-Code
<?php
	$a = 'Dies ist ein Beispielstring';
	$b = (binary)$a;
	var_dump($a, $b);
?>

HTML-Code: Ausgabe
string(27) "Dies ist ein Beispielstring"
string(27) "Dies ist ein Beispielstring"


10. Beispiel: Type Cast zwischen Klassen ist nicht möglich

Ein Type Cast zwischen verschiedenen Klassen ist nicht möglich, auch wenn diese zur selben Vererbungshierarchie gehören.

PHP-Code
<?php
	class Tier { }
	class Katze { }
	class Hauskatze { }
	
	$katze = new Hauskatze();
	$katze = (Tier)$katze;
?>

Das Ausführen des Codes erzeugt erwartungsgemäß einen Fehler beim Type Cast:

HTML-Code: Ausgabe
<br />
<b>Parse error</b>:  syntax error, unexpected T_VARIABLE in <b>...\test.php</b> on line <b>7</b><br />


11. Übersicht über Type Casts

Nachfolgend werden mehrere Tabellen dargestellt denen entnommen werden kann, wie PHP die jeweiligen Datentypen bei verschiedenen möglichen Type Casts behandelt. In der obersten Zeile sind jeweils die Werte aufgelistet, auf die die Type Casts angewendet werden. Der linken Spalte kann der verwendete Type Cast entnommen werden.

11.1. Verhalten bei Type Casts von Integer zu X

Type Casts von Integer zu anderen Datentypen. Beispiel: (float)((int)-1) ergibt (float)-1.

(int)-1 (int)0 (int)1
(int) (int)-1 (int)0 (int)1
(float) (float)-1 (float)0 (float)1
(string) (string)"-1" (string)"0" (string)"1"
(bool) (bool)true (bool)false (bool)true
(array) (array)((int)0 => (int)-1) (array)((int)0 => (int)0) (array)((int)0 => (int)1)
(object) (object)stdClass (object)stdClass (object)stdClass
(unset) NULL NULL NULL
(binary) (string)"-1" (string)"0" (string)"1"

11.2. Verhalten bei Type Casts von Float zu X

Type Casts von Float zu anderen Datentypen. Beispiel: (string)((float)-1) ergibt (string)"-1".

(float)-1 (float)0 (float)1
(int) (int)-1 (int)0 (int)1
(float) (float)-1 (float)0 (float)1
(string) (string)"-1" (string)"0" (string)"1"
(bool) (bool)true (bool)false (bool)true
(array) (array)((int)0 => (float)-1) (array)((int)0 => (float)0) (array)((int)0 => (float)1)
(object) (object)stdClass (object)stdClass (object)stdClass
(unset) NULL NULL NULL
(binary) (string)"-1" (string)"0" (string)"1"

11.3. Verhalten bei Type Casts von Boolean zu X

Type Casts von Boolean zu anderen Datentypen. Beispiel: (string)((bool)false) ergibt (string)"".

(bool)false (bool)true
(int) (int)0 (int)1
(float) (float)0 (float)1
(string) (string)"" (string)"1"
(bool) (bool)false (bool)true
(array) (array)((int)0 => (bool)false) (array)((int)0 => (bool)true)
(object) (object)stdClass (object)stdClass
(unset) NULL NULL
(binary) (string)"" (string)"1"

11.4. Verhalten bei Type Casts von String zu X

Type Casts von String zu anderen Datentypen. Beispiel: (bool)((string)"10abc") ergibt (bool)true.

(string)"10abc" (string)"abc10"
(int) (int)10 (int)0
(float) (float)10 (float)0
(string) (string)"10abc" (string)"abc10"
(bool) (bool)true (bool)true
(array) (array)((int)0 => (string)"10abc") (array)((int)0 => (string)"abc10")
(object) (object)stdClass (object)stdClass
(unset) NULL NULL
(binary) (string)"10abc" (string)"abc10"

11.5. Verhalten bei Type Casts von Array zu X

Type Casts von Array zu anderen Datentypen. Beispiel: (float)(array(1, 2,3)) ergibt (float)1.

(array)((int)0 => (int)1, (int)1 => (int)2, (int)2 => (int)3)
(int) (int)1
(float) (float)1
(string) (string)"Array"
(bool) (bool)true
(array) (array)((int)0 => (int)1, (int)1 => (int)2, (int)2 => (int)3)
(object) (object)stdClass
(unset) NULL
(binary) (string)"Array"

11.6. Verhalten bei Type Casts von NULL zu X

Type Casts von NULL zu anderen Datentypen. Beispiel: (bool)null ergibt (bool)false.

NULL
(int) (int)0
(float) (float)0
(string) (string)""
(bool) (bool)false
(array) (array)()
(object) (object)stdClass
(unset) NULL
(binary) (string)""

11.7. Skript zum Erstellen der Tabellen

Die obigen Tabellen wurden mit dem nachfolgenden Skript generiert:

PHP-Code
<?php
	// Funktion zum Ausgeben von Variablen inklusive Datentyp
	function showVar($var, $showType) {
		if (is_int($var)) {
			return ($showType ? '(int)'.$var : $var);
		} else if (is_float($var)) {
			return ($showType ? '(float)'.round($var, 4) : round($var, 4));
		} else if (is_string($var)) {
			return ($showType ? '(string)"'.$var.'"' : '"'.$var.'"');
		} else if (is_bool($var)) {
			$var = ($var ? 'true' : 'false');
			return ($showType ? '(bool)'.$var : $var);
		} else if (is_array($var)) {
			$out = ($showType ? '(array)(' : '(');
			$c = '';
			foreach ($var as $key=>$val) {
				if ($c!=='') {
					$c .= ', ';
				}
				$c .= showVar($key, $showType) . ' => ' . showVar($val, $showType);
			}
			$out .= $c . ')';
			return $out;
		} else if (is_object($var)) {
			return ($showType ? '(object)'.get_class($var) : get_class($var));
		} else if (is_resource($var)) {
			return '(resource)';
		} else if (is_null($var)) {
			return 'NULL';
		} else {
			return '('.gettype($var).')?';
		}
	}

	// Funktion zum Generieren einer Tabelle,
	// iteriert ueber alle Werte zum Erzeugen des Tabellenkopfs
	// dann ueber alle Casts und fuer jeden Cast ueber alle Werte
	// so wird jeder Cast ein mal auf jeden Wert angewendet
	function printTable($values, $casts) {
		?>
		<table class="type-casts-example">
			<thead>
				<tr>
					<th></th>
					<?php foreach ($values as $val): ?>
						<th><?php echo showVar($val, true); ?></th>
					<?php endforeach; ?>
				</tr>
				<?php foreach ($casts as $cast): ?>
					<tr>
						<td>(<?php echo $cast; ?>)</td>
						<?php foreach ($values as $val): ?>
							<?php eval('$tmp = ('.$cast.')$val;'); ?>
							<td><?php echo(showVar($tmp, true)); ?></td>
						<?php endforeach; ?>
					</tr>
				<?php endforeach; ?>
			</thead>
		</table>
		<?php
	}

	// Die durchzufuehrenden Casts
	$casts = array('int', 'float', 'string', 'bool', 'array', 'object', 'unset', 'binary');
	
	// Ausgabe der Tabellen
	printTable(array(-1, 0, 1), $casts);
	printTable(array(-1.0, 0.0, 1.0), $casts);
	printTable(array(false, true), $casts);
	printTable(array('10abc', 'abc10'), $casts);
	printTable(array(array(1, 2, 3)), $casts);
	printTable(array(null), $casts);
?>

Kommentare (0)

Von neu nach alt