What is the difference between doing a (string) cast and strval() in PHP? Which should I use?
(string)$valuestrval($value)
A value can be converted to a string using the (string) cast or the strval() function.
― https://www.php.net/manual/en/language.types.string.php#language.types.string.casting
Looks the same to me.
Community warning: this answer is factually incorrect.
(string)$vardoes not explicitly convert the "type" of$varduring evaluation but returns the the string value of$varall the same. Neither of these expressions are "faster", being essentially the same.
They are generally interchangeable because PHP uses automatic type conversion and a variable's type is determined by the context in which the variable is used.
Some differences are that strval($var) will return the string value of $var while (string)$var is explicitly converting the "type" of $var during evaluation.
Also, from the manual for strval():
$varmay be any scalar type or an object that implements the__toStringmethod. You cannot usestrval()on arrays or on objects that do not implement the__toStringmethod.
As mentioned by @Lars (string) is generally faster.
(string)-cast. Thus no different here.I'm not sure how this applies to various versions of PHP, but when looking at the generated opcodes, both variants generate the same opcodes, and thus perform exactly the same.
Input:
<?php
function s1(int $val) {
return (string)$val;
}
function s2(int $val) {
return strval($val);
}
Output as generated by 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
strval() is a function call, whereas cast is an internal typecast. Without having checked, I'd guess the cast is faster by a few cycles, but it shouldn't really make a difference.
1000000 times of strval on 5.6.37 => 0.38586091995239 vs (string) => 0.30763101577759. And on 7.2.8, strval => 0.24432492256165 vs (string) => 0.24242401123047. Tried with a random double $double = 0.001614654;. So good to know but not a big difference there (and wonder what was the value for the up to 6x result). Using microtime(true).PHP Inspections (EA Extended) plugin. This is not displayed by default in PhpStorm.There is an advantage of using strval() over (string), Which is we can use strval as a callback function, Something we cannot do with (string).
$arr = [1, 2, 3];
echo(json_encode($arr)); // [1,2,3]
$arr = array_map('strval', $arr);
echo(json_encode($arr)); // ["1","2","3"]
$arr = array_map(fn($s) => (string)$s, $arr);, classic anonymous function variant would be function ($s) { return (string)$s; }, all are pretty fast, in very very extreme cases strval can be a bit faster, probably due to direct translation to a native function call. But we're talking arrays with tens of thousands items and difference in miliseconds :-) So choose readability that suits you best.
strval($value)would magically 'convert' a binary string into something that fits in the default (UTF-8) encoding of PHP. Then I realised all of the native string functions are actually byte functions. There is no advantage in usingstrval()over(string).