Was ist der Unterschied zwischen einem Saitenwurf und strval
in PHP?
-
strval($value)
; -
(string)$value
;
Schrittmacher
Was ist der Unterschied zwischen einem Saitenwurf und strval
in PHP?
strval($value)
;
(string)$value
;
http://www.php.net/manual/en/language.types.string.php#language.types.string.casting
Ein Wert kann mit dem (string) Cast oder der Funktion strval() in einen String umgewandelt werden.
Sieht für mich genauso aus.
Nachteule
Sie sind im Allgemeinen austauschbar, da PHP eine automatische Typkonvertierung verwendet und der Typ einer Variablen durch den Kontext bestimmt wird, in dem die Variable verwendet wird.
Einige Unterschiede sind das strval($var)
gibt den Zeichenfolgenwert von zurück $var
während (string)$var
konvertiert explizit den “Typ” von $var
während der Auswertung.
Auch von der Handbuch zum strval()
:
$var
kann ein beliebiger Skalartyp oder ein Objekt sein, das die implementiert__toString
Methode. Sie können nicht verwendenstrval()
auf Arrays oder auf Objekten, die die nicht implementieren__toString
Methode.
Wie von @Lars erwähnt (string)
ist generell schneller.
“$var ändert tatsächlich den “Typ” von $var.”: Das ist falsch, denn solange Sie der Variablen nichts zuweisen, wird sie nichts ändern. “Sie können strval() nicht für Arrays oder Objekte verwenden, die die __toString-Methode nicht implementieren.” Das stimmt, aber das gilt auch für die (string)
-gießen. Also hier nicht anders.
– KingCrunch
10. September 2011 um 17:00 Uhr
Ich stehe korrigiert. Ich habe meine Antwort angepasst, um genauer zu sein. Die Dokumentation auf der Seite mit dem booleschen Typ verwendet den Ausdruck „explizit konvertieren“, also habe ich das so verstanden, dass der Typ von $var geändert wurde, aber dafür ist ein Aufruf von settype() erforderlich.
– Nachteule
10. September 2011 um 17:21 Uhr
könntest du einen Link zu dem Handbuch geben, von dem du sprichst?
– Schrittmacher
10. September 2011 um 18:17 Uhr
Das Zitat “Um einen Wert explizit in einen booleschen Wert umzuwandeln, verwenden Sie die Umwandlungen (bool) oder (boolean).” kommt von der Seite “Booleans” … us3.php.net/manual/en/… direkt unter der Abschnittsüberschrift “Converting to boolean”.
– Nachteule
10. September 2011 um 18:46 Uhr
Ich würde argumentieren, dass Casts im Allgemeinen eher als kanonisches “modernes” PHP bevorzugt werden. Sie können kleine Leistungsunterschiede aufweisen, aber Casting ist auch eine Technik, die in zahlreichen anderen Sprachen verwendet wird. Der Trend in PHP hat sich von kleinen C-ähnlichen Funktionen zu Sprachfeatures (Destrukturierung, Casting, Nullkoaleszenz usw.) für allgemeine Datenoperationen entwickelt. Ich denke, dass dies auch in anderen Gemeinden einem ähnlichen Trend folgt.
– Rob_vH
11. Juni 2020 um 17:59 Uhr
Einer ist ein Funktionsaufruf, der andere ist eine interne Typumwandlung. Ohne es überprüft zu haben, würde ich vermuten, dass letzteres um einige Zyklen schneller ist, aber keinen wirklichen Unterschied machen sollte.
Einige Benchmarks dafür, die auch Verkettung und Interpolation enthalten: leifw.wickland.net/2009/08/…
– Kim Högeling
5. Februar 2015 um 12:20 Uhr
Dies kann in älteren PHP-Versionen korrekt gewesen sein, ich habe das nicht überprüft. Aber das stimmt heutzutage sicher nicht mehr, denn PHP optimiert nun den Funktionsaufruf weg.
– jlh
18. Mai 2021 um 9:49 Uhr
Ich bin mir nicht sicher, wie dies auf verschiedene Versionen von PHP zutrifft, aber wenn ich mir die generierten Opcodes ansehe, beide Varianten erzeugen die gleichen Opcodesund führen daher genau das gleiche aus.
Eingang:
<?php
function s1(int $val) {
return (string)$val;
}
function s2(int $val) {
return strval($val);
}
Ausgabe wie generiert von https://3v4l.org/3gFWj/vld#output
Function s1:
Finding entry points
Branch analysis from position: 0
1 jumps found. (Code = 62) Position 1 = -2
filename: /in/3gFWj
function name: s1
number of ops: 4
compiled vars: !0 = $val
line #* E I O op fetch ext return operands
-------------------------------------------------------------------------------------
2 0 E > RECV !0
3 1 MAKE_REF ~1 !0
2 > RETURN ~1
4 3* > RETURN null
End of function s1
Function s2:
Finding entry points
Branch analysis from position: 0
1 jumps found. (Code = 62) Position 1 = -2
filename: /in/3gFWj
function name: s2
number of ops: 4
compiled vars: !0 = $val
line #* E I O op fetch ext return operands
-------------------------------------------------------------------------------------
5 0 E > RECV !0
6 1 MAKE_REF ~1 !0
2 > RETURN ~1
7 3* > RETURN null
End of function s2
TAHER El Mehdi
Es gibt einen Vorteil der Verwendung strval()
Über (string)
Was wir verwenden können strval
als Callback-Funktion, etwas, mit dem wir nichts anfangen können (string)
.
$arr = [1, 2, 3];
echo(json_encode($arr)); // [1,2,3]
$arr = array_map('strval', $arr);
echo(json_encode($arr)); // ["1","2","3"]
Das hatte ich gehofft
strval($value)
würde einen binären String auf magische Weise in etwas „konvertieren“, das in die Standardcodierung (UTF-8) von PHP passt. Dann wurde mir klar, dass alle nativen String-Funktionen tatsächlich Byte-Funktionen sind. Es gibt keinen Vorteil in der Verwendungstrval()
Über(string)
.– Code4R7
3. Juli 2018 um 9:35 Uhr