从源码角度看 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 的代码没有什么提高,或者对我来说没有遇到什么让我提高的地方。单纯的出于对知识求甚解的原因吧。

相关文章
|
1月前
|
PHP SEO
最新版两款不同版SEO超级外链工具PHP源码
外链工具只是网站推广的辅助工具,一般适用于短时间内无法建设大量外链的新站,新站应坚持每天做一到两次为宜,大约一周左右能看到效果。老站不建议使用此类工具,老站应以优质内容建设为主,辅以交换优质的友情链接和高权重站点发布软文来建立外链方为上策
24 2
最新版两款不同版SEO超级外链工具PHP源码
|
5天前
|
存储 安全 前端开发
PHP医院安全不良事件管理系统源码(AEMS)前端vue2+element+后端laravel8不良事件上报与闭环管理
医院不良事件上报与管理系统结合现代医院管理思路,遵照PDCA全面质量循环管理方法而设计,并在多家大型三甲医院成熟运用。系统从事件上报、基于人、机、料、法 、环的RCA分析、事件整改、效果评估实现了结构化、标准化、智能化的管理和分析,满足医院可追溯化、全流程闭环管理要求,满足等级医院评审细则要求,大力提高医院不良事件上报的效率,保障事件分析的准确性,促进医疗安全的提高,避免同类事件再次发生,改善整个医院医疗安全,从而实现医院安全医疗的目标。
21 3
|
6天前
|
监控 安全 前端开发
PHP基于B/S版 医院不良事件管理系统源码vscode+laravel8医院如何加强不良事件上报系统的管理 AEMS系统源码
医院安全(不良)事件管理AEMS系统构建全院人员,在医疗、环境、设备、服务及相关制度体系运行过程中,发现存在的不良、隐患事件,能够以匿名、实名方式主动、方便、快捷的上报、反馈。
21 6
|
7天前
|
监控 安全 PHP
采用PHP开发的不良事件管理系统源码vue2+element医院不良事件上报系统的意义 AEMS系统源码
不良事件管理系统(AEMS)是一种用于医疗行业的解决方案,它主要用于处理和管理临床不良事件。这些不良事件是指由医疗导致的伤害,与疾病的自然转归相反,可能延长病人的住院时间或导致残疾。AEMS的目标是揭示系统的不足与缺陷,减少不良事件对病人、家属、医护人员和医院声誉的影响。
21 1
|
8天前
|
人工智能 安全 前端开发
PHP医疗不良事件上报系统源码 AEMS 医院安全(不良)事件报告系统源码 可提供演示
根据报告系统主体和适用范围;根据所报告事件强制性要求 分为自愿报告系统和强制报告系统。强制报告系统主要定义为严重的、可预防的护理差错和可以确定的不良事件,几乎所有医院的护理主管部门都制订了不良事件上报制度,以便有效地分析事件原因。自愿报告系统是强制报告系统的补充,要求和鼓励护理主管部门或个人自愿上报不 良事件,更有助于发现组织系统的安全 隐患,加强护理安全管理。
23 4
|
9天前
|
存储 监控 安全
PHP医院安全(不良)事件报告系统源码 vue2+element支持11大类不良事件上报、审核处理、分析改进
医院安全(不良)事件管理系统采用无责的、自愿的填报不良事件方式,有效地减轻医护人员的思想压力,实现以事件为主要对象,可以自动、及时、实际地反应医院的安全、不良、近失事件的情况,更好地掌握不良事件的发生趋势,为及时采取适当的管理措施和流程、制度改进提供了良好的量化依据。系统通过汇集不同类型事件的报告,从中分析出医院内部潜在的问题和风险,将发生的事故降到最低,从而保证病人安全和医护人员安全。
21 0
|
13天前
|
PHP 数据库
DIY私人图床:使用CFimagehost源码自建无需数据库支持的PHP图片托管服务-2
DIY私人图床:使用CFimagehost源码自建无需数据库支持的PHP图片托管服务
|
13天前
|
存储 PHP Apache
DIY私人图床:使用CFimagehost源码自建无需数据库支持的PHP图片托管服务-1
DIY私人图床:使用CFimagehost源码自建无需数据库支持的PHP图片托管服务
|
18天前
|
存储 监控 安全
采用php vue2 开发的一套医院安全(不良)事件管理系统源码(可自动生成鱼骨图)
医院安全(不良)事件管理系统采用无责的、自愿的填报不良事件方式,有效地减轻医护人员的思想压力,以事件为主要对象,可以自动、及时、实际地发现医院的安全、不良、近失事件的情况,更好地掌握不良事件的发生趋势,为及时采取适当的管理措施和流程、制度改进提供了良好的量化依据。通过汇集不同类型事件的报告,从中分析出医院内部潜在的问题和风险,将发生的事故降到最低,从而保证病人安全和医护人员安全。
17 0
|
1月前
|
安全 PHP 数据库
PHP医院安全不良事件报告系统B/S源码
医疗安全(不良)事件是指在临床诊疗活动中,任何可能影响病人的诊疗结果、增加病人痛苦和负担并可能引发医疗纠纷或医疗事故,以及影响医疗工作的正常运行和医务人员人身安全的因素和事件。
12 0