在php中执行字符串转换和strval
有什么区别?
strval($value)
;
(string)$value
;
答案 0 :(得分:21)
http://www.php.net/manual/en/language.types.string.php#language.types.string.casting
可以使用(string)强制转换或strval()函数将值转换为字符串。
对我来说也一样。
答案 1 :(得分:5)
一个是函数调用,另一个是内部类型转换。如果没有检查过,我猜测后者会在几个周期内更快,但不应该真正有所作为。
答案 2 :(得分:4)
它们通常是可互换的,因为PHP使用自动类型转换,变量的类型由使用变量的上下文决定。
有些不同之处在于strval($var)
将返回$var
的字符串值,而(string)$var
在评估过程中明确转换$var
的“类型”。
此外,来自strval()
的{{3}}:
$var
可以是任何标量类型或实现__toString
方法的对象。您不能在数组或未实现strval()
方法的对象上使用__toString
。
正如@Lars所提到的(string)
通常更快。
答案 3 :(得分:0)
答案 4 :(得分:0)
我不确定这如何适用于各种版本的 PHP,但是在查看生成的操作码时,两个变体生成相同的操作码,因此执行完全相同。
输入:
<?php
function s1(int $val) {
return (string)$val;
}
function s2(int $val) {
return strval($val);
}
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
答案 5 :(得分:0)
使用 strval()
比使用 (string)
有一个优势,即我们可以使用 strval
作为回调函数,这是我们无法使用 (string)
做的。
$arr = [1, 2, 3];
echo(json_encode($arr)); // [1,2,3]
$arr = array_map('strval', $arr);
echo(json_encode($arr)); // ["1","2","3"]