首页 > 作文

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

更新时间:2023-04-07 21:48:39 阅读: 评论:0

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

通过实例看转换

写个关于 php 类型转换的代码测试一下吧,看看大家是否能知道输出结果。各种数据类型16地平均工资出炉 都转换为 字符串类型试试。

 1 <?php 2  3 $var = fal; 4 echo '$var:', $var, "\r\n"; 5  6 $var = null; 7 echo '$var:', $var, "\r\n"; 8  9 $var = true;10 echo '$var:', $var, "\r\n";11 12 $var = 1;13 echo '$var:', $var, "\r\n";14 15 $var = 1.1;16 echo '$var:', $var, "\r\n";17 $var1 = &$var;18 echo '$var:', $var1, "\r\n";19 20 $var1 = 'string111';21 echo '$var:', $var1, "\r\n";22 23 $var = [1, 2, 3];24 echo '$var:', $var, "\r\n";25 26 class obj27 {28     private $field;29 }30 31 $var = new obj();32 echo '$var:', $var, "\r\n";

送女生什么生日礼物比较好 代码很简单,大家可以猜猜输出结果,然后再和运行结果比对一下,运行结果如下:

 1 $ php string.php 2 $var: 3 $var: 4 $var:1 5 $var:1 6 $var:1.1 7 $var:1.1 8 $var:string111 9 $var:10 notice: array to string conversion in c:\urs\administrator\desktop\string.php11 on line 2412 13 call stack:14     0.0010     405568   1. {main}() c:\urs\administrator\desktop\string.php:015 16 array17 $var:18 catchable fatal error: object of class obj could not be converted to string in c19 :\urs\administrator\desktop\string.php on line 3220世界杯赛事 21 call stack:22     0.0010     405568   年会酒店1. {main}() c:\urs\administrator\desktop\string.php:0

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

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

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

 1 zend_api zend_string* zend_fastcall _zval_get_string_func(zval *op) /* {{{ */ 2 { 3 try_again: 4   switch (z_type_p(op)) { 5     ca is_undef: 6     ca is_null: 7     ca is_fal: 8       return zstr_empty_alloc(); 9     ca is_true:10       return zstr_char('1');11     ca is_resource: {12       char buf[sizeof("resource id #") + max_length_of_long];13       int len;14 15       len = snprintf(buf, sizeof(buf), "resource id #" zend_long_fmt, (zend_long)z_res_handle_p(op));16       return zend_string_init(buf, len, 0);17     }18     ca is_long: {19       return zend_long_to_str(z_lval_p(op));20     }21     ca is_double: {22       return zend_strpprintf(0, "%.*g", (int) eg(precision), z_dval_p(op));23     }24     ca is_array:25       zend_error(e_notice, "array to string conversion");26       return zend_string_init("array", sizeof("array")-1, 0);27     ca is_object: {28       zval tmp;29       if (z_obj_ht_p(op)->cast_object) {30         if (z_obj_ht_p(op)->cast_object(op, &tmp, is_string) == success) {31           return z_str(tmp);32         }33       } el if (z_obj_ht_p(op)->get) {34         zval *z = z_obj_ht_p(op)->get(op, &tmp);35         if (z_type_p(z) != is_object) {36           zend_string *str = zval_get_string(z);37           zval_ptr_dtor(z);38           return str;39         }40         zval_ptr_dtor(z);41       }42       zend_error(eg(exception) ? e_error : e_recoverable_error, "object of class %s could not be converted to string", zstr_val(z_objce_p(op)->name));43       return zstr_empty_alloc();44     }45     ca is_reference:46       op = z_refval_p(op);47       goto try_again;48     ca is_string:49       return zend_string_copy(z_str_p(op));50     empty_switch_default_ca()51   }52   return null;53 }54 /* }}} */

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

最后

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

我的微信公众号:“码农up2u”

本文发布于:2023-04-07 21:48:37,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/zuowen/ad30b46788fa4c5318a353146e108146.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

本文word下载地址:从源码角度看 PHP 字符串类型转换.doc

本文 PDF 下载地址:从源码角度看 PHP 字符串类型转换.pdf

下一篇:返回列表
标签:类型   源码   转换为   字符串
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图