从源码角度看 PHP 字符串类型转换

PHP   2023-03-13 21:14   561   0  

e6a87d928e77d622935512420d4bf9cb2193a6.png

PHP 的类型转换是比较方便的,但是越是容易使用的东西,底层的实现越是复杂,而且在使用中像我这样的新手也往往不清楚转换后的结果到底是什么。有时候,对于 Java 这种强类型的语言,使用的时候需要强制进行转换,这样多半转换后的结果是可以预料的,至少自己是想这么做的。

通过实例看转换

写个关于 PHP 类型转换的代码测试一下吧,看看大家是否能知道输出结果。把 各种数据类型 都转换为 字符串类型试试。

php
$var  ;
echo , $var, ;
$var  ;
echo , $var, ;
$var  ;
echo , $var, ;
$var  ;
echo , $var, ;
$var  ;
echo , $var, ;
$var1  $var;
echo , $var1, ;
$var1  ;
echo , $var1, ;
$var  [, , ];
echo , $var, ;
 
{
     $field;
}
$var   Obj();
echo , $var, ;

代码很简单,大家可以猜猜输出结果,然后再和运行结果比对一下,运行结果如下:

$ php string.php
$var:
$var:
$var:
$var:
$var:
$var:
$var:string111
$var:
Notice: Array to string conversion in C:\Users\Administrator\Desktop\string.php
on line 
Call Stack:
             {main}() C:\Users\Administrator\Desktop\string.php:
Array
$var:
Catchable fatal error:  of          
:\Users\Administrator\Desktop\string.php on line 
Call Stack:
             {main}() C:\Users\Administrator\Desktop\string.php:

不知道是否实际的运行结果和猜测的结果是否一致。

PHP 源码中各类型转换为字符串类型的处理

对于各种类型之间的赋值,并转换为字符串,使用真的是非常的方便。但是,实际的功劳都是 PHP 底层的复杂处理。看一下关于各种类型转换为字符串类型的源代码的处理。

ZEND_API zend_string ZEND_FASTCALL (zval op) 
{
try_again:
   (Z_TYPE_P(op)) {
     IS_UNDEF:
     IS_NULL:
     IS_FALSE:
       ZSTR_EMPTY_ALLOC();
     IS_TRUE:
       ZSTR_CHAR();
     IS_RESOURCE: {
       buf[sizeof()  MAX_LENGTH_OF_LONG];
       len;
      len  snprintf(buf, sizeof(buf),  ZEND_LONG_FMT, (zend_long)Z_RES_HANDLE_P(op));
       zend_string_init(buf, len, );
    }
     IS_LONG: {
       zend_long_to_str(Z_LVAL_P(op));
    }
     IS_DOUBLE: {
       zend_strpprintf(, , () EG(precision), Z_DVAL_P(op));
    }
     IS_ARRAY:
      zend_error(E_NOTICE, );
       zend_string_init(, sizeof(), );
     IS_OBJECT: {
      zval tmp;
       (Z_OBJ_HT_P(op)cast_object) {
         (Z_OBJ_HT_P(op)cast_object(op, tmp, IS_STRING)  SUCCESS) {
           Z_STR(tmp);
        }
      }   (Z_OBJ_HT_P(op)get) {
        zval z  Z_OBJ_HT_P(op)get(op, tmp);
         (Z_TYPE_P(z)  IS_OBJECT) {
          zend_string str  zval_get_string(z);
          zval_ptr_dtor(z);
           str;
        }
        zval_ptr_dtor(z);
      }
      zend_error(EG(exception)  E_ERROR : E_RECOVERABLE_ERROR, , ZSTR_VAL(Z_OBJCE_P(op)name));
       ZSTR_EMPTY_ALLOC();
    }
     IS_REFERENCE:
      op  Z_REFVAL_P(op);
       try_again;
     IS_STRING:
       zend_string_copy(Z_STR_P(op));
    EMPTY_SWITCH_DEFAULT_CASE()
  }
   NULL;
}

从上面的源码中可以看出,对于类型的转换,PHP 底层的源码使用了 switch ... case 的结构,在进行转换的时候需要对逐个的类型进行匹配后,再进行转换。当然,从源码的角度去看待上面的 PHP 类型转换的代码就非常的清晰明了了。

最后

读 PHP 的源码有一段时间了,进度比较慢,说实话,对于写 PHP 的代码没有什么提高,或者对我来说没有遇到什么让我提高的地方。单纯的出于对知识求甚解的原因吧。

博客评论
还没有人评论,赶紧抢个沙发~
发表评论
说明:请文明发言,共建和谐网络,您的个人信息不会被公开显示。
闲言碎语
路上有你,苦一点也愿意,苦很多就算了
赞赏支持

如果觉得博客文章对您有帮助,异或土豪有钱任性,可以通过以下扫码向我捐助。也可以动动手指,帮我分享和传播。您的肯定,是我不懈努力的动力!感谢各位亲~