我应该使用Php string cast vs strval函数?

Pac*_*ier 23 php string

在字符串转换和strvalphp中有什么区别?

  1. strval($value);

  2. (string)$value;

Cod*_*ter 23

http://www.php.net/manual/en/language.types.string.php#language.types.string.casting

可以使用(string)强制转换或strval()函数将值转换为字符串.

看起来和我一样.


Nig*_*Owl 8

它们通常可以互换,因为 PHP 使用自动类型转换,并且变量的类型由使用变量的上下文确定。

一些区别是strval($var)将返回字符串值,$var而在评估期间(string)$var显式转换“类型” $var

此外,从手册strval()

$var可以是任何标量类型或实现该__toString方法的对象。您不能strval()在未实现该__toString方法的数组或对象上使用。

正如@Lars 所提到的,(string)通常更快。

  • “$var 实际上正在改变 $var 的“类型”。”:那是错误的,因为只要你不给变量赋值,什么都不会改变它。“您不能在数组或未实现 __toString 方法的对象上使用 strval()。” 没错,但这也适用于`(string)`-cast。因此这里没有什么不同。 (3认同)

jlh*_*jlh 6

我不确定这如何适用于不同版本的 PHP,但是当查看生成的操作码时,两个变体都会生成相同的操作码,因此执行完全相同。

输入:

<?php
function s1(int $val) {
    return (string)$val;
}
function s2(int $val) {
    return strval($val);
}
Run Code Online (Sandbox Code Playgroud)

由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
Run Code Online (Sandbox Code Playgroud)


Lar*_*ars 5

一个是函数调用,另一个是内部类型转换.如果没有检查,我猜测后者会在几个周期内更快,但不应该真正有所作为.

  • 这在旧版本的 PHP 中可能是正确的,我还没有验证这一点。但现在情况肯定不再如此了,因为 PHP 现在优化了函数调用。 (2认同)