PHP hat, wie die meisten von uns wissen, eine schwache Typisierung . Für diejenigen, die dies nicht tun, sagt PHP.net:
PHP benötigt (oder unterstützt) keine explizite Typdefinition in der Variablendeklaration. Der Typ einer Variablen wird durch den Kontext bestimmt, in dem die Variable verwendet wird.
Lieben Sie es oder hassen Sie es, PHP wandelt Variablen on-the-fly um. Der folgende Code ist also gültig:
$var = "10";
$value = 10 + $var;
var_dump($value); // int(20)
Mit PHP können Sie auch explizit eine Variable wie folgt umwandeln:
$var = "10";
$value = 10 + $var;
$value = (string)$value;
var_dump($value); // string(2) "20"
Das ist alles cool ... aber für mein Leben kann ich mir keinen praktischen Grund dafür vorstellen.
Ich habe kein Problem mit starken Eingaben in Sprachen wie Java, die dies unterstützen. Das ist in Ordnung und ich verstehe es vollkommen. Außerdem bin ich mir der Nützlichkeit von Typhinweisen in Funktionsparametern bewusst und verstehe sie vollständig .
Das Problem, das ich beim Typgießen habe, wird durch das obige Zitat erklärt. Wenn PHP Typen nach Belieben austauschen kann , kann dies auch nach dem Erzwingen des Castens eines Typs geschehen. Dies ist im Handumdrehen möglich, wenn Sie für eine Operation einen bestimmten Typ benötigen. Das macht Folgendes gültig:
$var = "10";
$value = (int)$var;
$value = $value . ' TaDa!';
var_dump($value); // string(8) "10 TaDa!"
Also, was ist der Punkt?
Nehmen Sie dieses theoretische Beispiel einer Welt, in der benutzerdefiniertes Typ-Casting in PHP Sinn macht :
- Sie erzwingen die Umwandlung einer Variablen
$foo
alsint
→(int)$foo
. - Sie versuchen, einen Zeichenfolgenwert in der Variablen zu speichern
$foo
. - PHP wirft eine Ausnahme !! ← Das wäre sinnvoll. Plötzlich besteht der Grund für benutzerdefiniertes Typ-Casting!
Die Tatsache, dass PHP die Dinge nach Bedarf umdreht, macht den Punkt der benutzerdefinierten Typumwandlung vage. Die folgenden zwei Codebeispiele sind beispielsweise äquivalent:
// example 1
$foo = 0;
$foo = (string)$foo;
$foo = '# of Reasons for the programmer to type cast $foo as a string: ' . $foo;
// example 2
$foo = 0;
$foo = (int)$foo;
$foo = '# of Reasons for the programmer to type cast $foo as a string: ' . $foo;
Erraten Sie ein Jahr, nachdem Sie diese Frage ursprünglich gestellt hatten, wer Typografie in einer praktischen Umgebung verwendet hat? Mit freundlichen Grüßen.
Die Anforderung bestand darin, Geldwerte auf einer Website für ein Restaurantmenü anzuzeigen. Das Design der Site erforderte, dass nachfolgende Nullen abgeschnitten wurden, sodass die Anzeige etwa wie folgt aussah:
Menu Item 1 .............. $ 4
Menu Item 2 .............. $ 7.5
Menu Item 3 .............. $ 3
Der beste Weg, diese Verschwendung zu tun, um die Variable als Float umzuwandeln:
$price = '7.50'; // a string from the database layer.
echo 'Menu Item 2 .............. $ ' . (float)$price;
PHP schneidet die nachgestellten Nullen des Floats ab und setzt den Float dann als String zur Verkettung um.
(string)
Abgüsse haben ?
$intval.'bar'
wirft eine Ausnahme, ich bin immer noch nicht einverstanden. Das macht in keiner Sprache eine Ausnahme. (Alle mir bekannten Sprachen führen entweder eine automatische Besetzung oder eine aus .toString()
). Wenn Sie sagen, $intval = $stringval
wirft eine Ausnahme, dann sprechen Sie über eine stark typisierte Sprache. Ich wollte nicht unhöflich klingen, also tut mir leid, wenn ich es tat. Ich denke nur, es widerspricht dem, was jeder Entwickler gewohnt ist und ist viel, viel weniger bequem.