Php-String-Cast vs. Strval-Funktion, welche sollte ich verwenden?

Lesezeit: 4 Minuten

Benutzer-Avatar
Schrittmacher

Was ist der Unterschied zwischen einem Saitenwurf und strval in PHP?

  1. strval($value);

  2. (string)$value;

  • 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 Verwendung strval() Über (string).

    – Code4R7

    3. Juli 2018 um 9:35 Uhr


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.

Benutzer-Avatar
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 verwenden strval() 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

Zu spät zur Party, aber laut PHPstorm (string) ist schneller

(Zeichenfolge) ist schneller

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

Benutzer-Avatar
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"]

1144560cookie-checkPhp-String-Cast vs. Strval-Funktion, welche sollte ich verwenden?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy