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 条评论) |