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

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

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


通过实例看转换

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

<?php$var=false;
echo'$var:', $var, "\r\n";
$var=null;
echo'$var:', $var, "\r\n";
$var=true;
echo'$var:', $var, "\r\n";
$var=1;
echo'$var:', $var, "\r\n";
$var=1.1;
echo'$var:', $var, "\r\n";
$var1=&$var;
echo'$var:', $var1, "\r\n";
$var1='string111';
echo'$var:', $var1, "\r\n";
$var= [1, 2, 3];
echo'$var:', $var, "\r\n";
classObj{
private$field;
}
$var=newObj();
echo'$var:', $var, "\r\n";

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

$ php string.php
$var:
$var:
$var:1
$var:1
$var:1.1
$var:1.1
$var:string111
$var:
Notice: Array to string conversion in C:\Users\Administrator\Desktop\string.php
on line 24Call Stack:
0.0010     4055681. {main}() C:\Users\Administrator\Desktop\string.php:0
Array
$var:
Catchable fatal error: Object of class Obj could not be converted to string in C
:\Users\Administrator\Desktop\string.php on line 32Call Stack:
0.0010     4055681. {main}() C:\Users\Administrator\Desktop\string.php:0

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


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

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

ZEND_APIzend_string*ZEND_FASTCALL_zval_get_string_func(zval*op) /* {{{ */{
try_again:
switch (Z_TYPE_P(op)) {
caseIS_UNDEF:
caseIS_NULL:
caseIS_FALSE:
returnZSTR_EMPTY_ALLOC();
caseIS_TRUE:
returnZSTR_CHAR('1');
caseIS_RESOURCE: {
charbuf[sizeof("Resource id #") +MAX_LENGTH_OF_LONG];
intlen;
len=snprintf(buf, sizeof(buf), "Resource id #"ZEND_LONG_FMT, (zend_long)Z_RES_HANDLE_P(op));
returnzend_string_init(buf, len, 0);
    }
caseIS_LONG: {
returnzend_long_to_str(Z_LVAL_P(op));
    }
caseIS_DOUBLE: {
returnzend_strpprintf(0, "%.*G", (int) EG(precision), Z_DVAL_P(op));
    }
caseIS_ARRAY:
zend_error(E_NOTICE, "Array to string conversion");
returnzend_string_init("Array", sizeof("Array")-1, 0);
caseIS_OBJECT: {
zvaltmp;
if (Z_OBJ_HT_P(op)->cast_object) {
if (Z_OBJ_HT_P(op)->cast_object(op, &tmp, IS_STRING) ==SUCCESS) {
returnZ_STR(tmp);
        }
      } elseif (Z_OBJ_HT_P(op)->get) {
zval*z=Z_OBJ_HT_P(op)->get(op, &tmp);
if (Z_TYPE_P(z) !=IS_OBJECT) {
zend_string*str=zval_get_string(z);
zval_ptr_dtor(z);
returnstr;
        }
zval_ptr_dtor(z);
      }
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));
returnZSTR_EMPTY_ALLOC();
    }
caseIS_REFERENCE:
op=Z_REFVAL_P(op);
gototry_again;
caseIS_STRING:
returnzend_string_copy(Z_STR_P(op));
EMPTY_SWITCH_DEFAULT_CASE()
  }
returnNULL;
}
/* }}} */

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


最后

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

相关文章
|
9天前
|
JavaScript PHP 数据安全/隐私保护
乞丐在线要饭系统PHP网站源码
在这个物欲横流、竞争激烈的时代,有时候我们真心觉得钱来得太不容易,甚至连最基本的生存都成了负担。于是,我们想出了一个特别“独特”的点子:用利息砸我,给我点施舍!
33 1
|
17天前
|
前端开发 PHP 数据库
原生PHP网站源码
原生PHP网站通常指的是使用纯PHP代码编写的网站,没有使用框架或者类库来简化开发流程。
25 1
|
2月前
|
JavaScript Java PHP
php学习笔记-php运算符,类型转换,打印输出语句相较于其他语言的特殊部分-day02
本文是第二天的PHP学习笔记,涵盖了PHP中运算符的使用、类型转换方式,以及打印输出语句的特点,展示了其相较于其他编程语言的一些特殊之处。
php学习笔记-php运算符,类型转换,打印输出语句相较于其他语言的特殊部分-day02
|
30天前
|
前端开发 JavaScript 小程序
前端uni开发后端用PHP的圈子系统该 如何做源码?
圈子系统系统基于TP6+Uni-app框架开发;客户移动端采用uni-app开发,管理后台TH6开发。系统支持微信公众号端、微信小程序端、H5端、PC端多端账号同步,可快速打包生成APP
|
1月前
|
前端开发 JavaScript PHP
Thinkphp在线客服系统源码多语言外贸版_PHP客服系统源码Uniapp开发搭建+论文设计
Thinkphp在线客服系统源码多语言外贸版_PHP客服系统源码Uniapp开发搭建+论文设计
|
2月前
|
PHP
PHP全自动采集在线高清壁纸网站源码
PHP全自动采集在线高清壁纸网站源码,PHP全自动采集在线高清壁纸网站源码,一款开源壁纸源码,无需安装。集合360壁纸,百度壁纸,必应壁纸,简单方便。每天自动采集,自动更新,非常不错,php源码 网站源码 免费源码 自动采集。
54 3
|
2月前
|
XML SQL PHP
php学习笔记-php字符串及字符串常用函数总结-day04
本文总结了PHP中字符串的三种定义方式和常用字符串处理函数,包括字符串的修剪、转换、长度计算、子串操作、比较、连接、分割及替换等操作。
|
2月前
|
PHP 数据库
2024表白墙PHP网站源码
2024表白墙PHP网站源码
42 1
|
3月前
|
安全 BI PHP
php前后端分离,仓储模式r的医院不良事件上报系统源码
此医院安全不良事件管理系统采用前后端分离架构(PHP+Laravel8+Vue2+Element),实现事件上报至解决的全流程管理。系统支持结构化上报、数据自动引用、智能流程及预警,配备质控分析工具生成各类报表。通过PDCA闭环管理,确保事件得到有效处置并预防再发,同时提供便捷上报通道,优化上报效率。
php前后端分离,仓储模式r的医院不良事件上报系统源码
|
3月前
|
前端开发 关系型数据库 MySQL
最新黑名单查询录入系统PHP网站源码
最新黑名单查询录入系统PHP网站源码 前端html 后端layui 操作部分都采用API接口的方式实线 集结了layui表格的多数据操作,添加,批量删除,分页,单项删除 后台数据修改采用绑定参数的形式来进行修改可以很好的预防数据库注入,当然如果你想要测试这个防注入的你也可以尝试一下 PHP版本70+ 数据库Mysql 5.6 上传程序访问 http://你的域名/install 安装
93 0
下一篇
无影云桌面