Gibt es einen besonderen Unterschied zwischen intval und (int)?
Beispiel:
$product_id = intval($_GET['pid']);
$product_id = (int) $_GET['pid'];
Gibt es einen besonderen Unterschied zwischen den beiden obigen Codezeilen?
intval()
kann eine Basis übergeben werden, von der konvertiert werden soll. (int)
kann nicht.
int intval( mixed $var [, int $base = 10 ] )
$i++
ist falsch in rot. Aber es sollte langsamer sein !!$i++
. Was meinst du? Wenn du sagst "Aber es sollte langsamer sein !!" was vergleichst du(int)
ist schneller x 2!(int)
: ideone.com/QggNGc ,intval()
: ideone.com/6Y8mPNEine Sache, die Sie über den Unterschied zwischen
(int)
und beachten solltenintval()
:intval()
Behandelt Variablen, die bereitsint
s undfloat
s sind, unabhängig vom Basisargument (zumindest ab PHP 5.3.5) als nicht konvertierungsbedürftig. Dieses Verhalten ist nicht das offensichtlichste, wie in den Kommentaren auf der PHP-Dokumentseite erwähnt und hier schamlos wiederholt:quelle
The base parameter has no effect unless the var parameter is a string.
Dann wieder die Seite wurde anscheinend 4 Tage aktualisiert, vor so vielleicht das ist , was hinzugefügt wurde.intval(12,8)
die eine Antwort geben würde, dass bei der Konvertierung in eine Zeichenfolge ohne Formatierung wie eine Basis 8 aussehen würde Nummer ist einfach falsch. Was würden Sie erwarten,intval(12,16)
weil es kein int a machen kannc
?Entschuldigung für das Nekroing, ich wollte nur sehen, ob / wie sich PHP7 auf diese Frage auswirkt:
Der Test:
Wie Sie sehen können, ist das Casting definitiv um fast 100% schneller
Aber ich musste die Anzahl der Schleifen auf 100 Millionen erhöhen, bevor der Unterschied eine Frage von Sekunden war. In den meisten Fällen würde ich mich dann tatsächlich um die Leistung kümmern.
Also bleibe ich bei der Verwendung der
intval
Funktion, denn Casting ist ein bisschen Sprachmagie, die gerade stattfindet. Selbst wennintval
Casting hinter den Kulissen verwendet wird, wenn beim Casting ein Fehler gefunden wird und dieser aus irgendeinem Grund nicht behoben werden kann (Abwärtskompatibilität?), Könnten sie zumindest das Problem behebenintval
, um seine Aufgabe zu erfüllen.Update (PHP 7.1 + Extrafall):
Sieht aus wie 7.1 optimiert
intval
, und ‚1‘ + 0 ist jetzt der Gewinner dieser Geschwindigkeit Wettbewerb :) ich noch mit halten würdeintval
sowiesoquelle
+0
der var ... nicht sicher, ob die implizite Umwandlung hier schneller ist als die explizite.+0
gewinnen ... das ist ein sehr schmutziger Hackv5.5.34
meine Ergebnisse waren9191.0059452057 ms
,23307.397127151 ms
und11483.719110489 ms
jeweils. Vor PHP 7 ist das Casting also das schnellste.$a = '1' + 0;
und ich wette, die meisten haben nie daran gedacht, es so zu machenIch denke, es gibt mindestens einen Unterschied: Mit intval können Sie angeben, welche Basis als zweiter Parameter verwendet werden soll (Basis 10 standardmäßig):
Kriege dich :
quelle
intval("2g", 17) = 50 = 2*17 + 16
36
, wie inintval("g", 36) //16
. Jeder Wert größer als 36 gibt 0 zurück. Dies legt nahe, dass wir alle 0-9 plus az-Zeichen für unsere benutzerdefinierte Basis verwenden können, zintval("z",36) //35
. Es sollte auch beachtet werden, dass der erste Parameter die Groß- und Kleinschreibung nicht berücksichtigt .Eine nützliche Eigenschaft von
intval
ist, dass es - da es sich um eine Funktion und nicht um ein Sprachkonstrukt handelt - als Argument an eine Funktion übergeben werden kann, die eine Funktion erwartet. Das kann man nicht machen(int)
.Zum Beispiel habe ich es verwendet, um Ganzzahlen für die Aufnahme in eine SQL-
IN()
Klausel zu bereinigen , indem ich sie an übergeben habearray_map
. Hier ist ein Beispiel:quelle
array_map(function($n){return (int)$n;}, $_POST['array_of_integers'])
Amber hat recht und wenn ich einen nützlichen Informationstyp hinzufügen darf, ist das Casting (Hinzufügen eines "(int)" vor Ihrem Ausdruck) 300 bis 600% schneller als intval. Wenn Sie also nicht mit anderen Basen als Dezimalzahlen arbeiten möchten, empfehle ich die Verwendung von:
(int) $something
quelle
Das, was
intval
eine einfache Besetzung nicht tut, ist die Basiskonvertierung:Wenn die Basis jedoch 10 ist,
intval
sollte dies mit einer Besetzung identisch sein (es sei denn, Sie werden pingelig sein und erwähnen, dass einer einen Funktionsaufruf ausführt, während der andere dies nicht tut). Wie auf der Manpage vermerkt :quelle