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

相关文章
|
23天前
|
前端开发 关系型数据库 MySQL
PHP外链网盘系统网站源码
> 本文将详细介绍如何从零构建一个基于PHP和MySQL的文件管理系统,分解项目代码并剖析每个模块的功能。我们将以`index.php`、`config.php`和`api.php`这三个核心文件为例,详细展示如何设计文件列表、数据库配置和文件上传接口,从而实现一个完整的文件管理系统。该文章可以作为学术研究和代码实现的参考。
152 98
|
19天前
|
关系型数据库 MySQL PHP
免登录游客卡密发放系统PHP网站源码
这是一个简单易用的卡密验证系统,主要功能包括: 卡密管理和验证,多模板支持,响应式设计,验证码保护,防刷机制,简洁的用户界面, 支持自定义模板,移动端优化,安全性保护,易于部署和维护。
144 77
|
22天前
|
移动开发 小程序 Linux
PHP仿WX即时聊天源码,支持视频语音聊天
PHP仿WX即时聊天源码,支持视频语音聊天
115 65
|
1月前
|
Linux PHP 数据安全/隐私保护
2024授权加密系统PHP网站源码
2024授权加密系统PHP网站源码
117 58
|
21天前
|
开发框架 小程序 前端开发
圈子社交app前端+后端源码,uniapp社交兴趣圈子开发,框架php圈子小程序安装搭建
本文介绍了圈子社交APP的源码获取、分析与定制,PHP实现的圈子框架设计及代码编写,以及圈子小程序的安装搭建。涵盖环境配置、数据库设计、前后端开发与接口对接等内容,确保平台的安全性、性能和功能完整性。通过详细指导,帮助开发者快速搭建稳定可靠的圈子社交平台。
165 18
|
1月前
|
前端开发 PHP 数据安全/隐私保护
知识付费系统源码 PHP
在数字经济背景下,知识付费成为新兴领域,尤其在线教育平台的兴起,使更多教育者通过知识付费系统销售课程,实现数字化转型与收入提升。开发此类平台需考虑众多技术细节和业务需求,如使用PHP语言实现支付功能,确保安全性、性能和可扩展性,选择合适的技术方案至关重要。
59 4
知识付费系统源码 PHP
|
28天前
|
移动开发 小程序 前端开发
使用php开发圈子系统特点,如何获取圈子系统源码,社交圈子运营以及圈子系统的功能特点,圈子系统,允许二开,免费源码,APP 小程序 H5
开发一个圈子系统(也称为社交网络或社群系统)可以是一个复杂但非常有趣的项目。以下是一些关键特点和步骤,帮助你理解如何开发、获取源码以及运营一个圈子系统。
122 3
|
2月前
|
PHP
20241125易支付PHP网站源码
PHP74,上传源码后解压访问域名/install 进行安装 安装完成 之后一定要设置伪静态 源码里面nginx.txt 就是伪静态 然后复制粘贴到伪静态里面保存即可
60 2
|
2月前
|
PHP
在PHP中,字符串操作
在PHP中,字符串操作
32 3
|
2月前
|
PHP
06 一文带你搞定PHP字符串操作
路老师带你深入PHP:本文详细介绍了PHP中的字符串定义、操作及常用函数,包括字符串的定义方式、定界符、字符串操作(如去除空格、获取长度、截取、替换、分割和合成等)。通过实例讲解,帮助你快速掌握PHP字符串处理技巧。
34 2