声明:本文为斯人原创,全部为作者一一分析得之,有不对的地方望赐教。
欢迎转载,转载请注明出处 。
本文地址:http://imsiren.com/archives/520

趁热打铁 顺便说说 intval函数.该函数好像我们用的最多的就是在POST或者GET某个参数的时候,将其强制转换为int型,

为了保证我们传入到SQL的时候是一个整形.,当然这只是其中一种用法..
该函数接受两个参数,第一个是要转换的字符串,第二个要转换成的进制数,默认为十进制.

我们先用PHP 来看看它的用法.

class a{public $b;function c(){}
}
$a=new a();
echo intval($a); //输出1.
$a=array('a'=>1,'b'=>2);
echo intval($a);//输出1
$a=false;
echo intval($a);//输出0
$a=true;
echo intval($a);//输出1
$a=1.9;
echo intval($a);//输出1
$a=null;
echo intval($a);//输出0

OK,看看它的定义.
同样定义在ext/standard/type.c文件中.

PHP_FUNCTION(intval)
{zval **num;long arg_base;int base;switch (ZEND_NUM_ARGS()) {case 1:if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Z", &num) == FAILURE) {return;}base = 10;break;case 2:if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Zl", &num, &arg_base) == FAILURE) {return;}base = arg_base;break;default:WRONG_PARAM_COUNT;}RETVAL_ZVAL(*num, 1, 0);convert_to_long_base(return_value, base);
}

该函数会根据我们传递过来的参数个数进行不同的处理.第二个参数是要转换成的进制数,如果为空默认为10进制.
最后会调用 convert_to_long_base(return_value, base);来对我们输入过来的数据进行处理
该函数定义在Zend/zend_operators.c中

ZEND_API void convert_to_long_base(zval *op, int base) /* {{{ */
{long tmp;               switch (Z_TYPE_P(op)) {case IS_NULL:Z_LVAL_P(op) = 0;break;case IS_RESOURCE: {TSRMLS_FETCH();zend_list_delete(Z_LVAL_P(op));}/* break missing intentionally */case IS_BOOL:case IS_LONG:break;case IS_DOUBLE:Z_LVAL_P(op) = zend_dval_to_lval(Z_DVAL_P(op));break;case IS_STRING:{char *strval = Z_STRVAL_P(op);Z_LVAL_P(op) = strtol(strval, NULL, base);STR_FREE(strval);}break;case IS_ARRAY:tmp = (zend_hash_num_elements(Z_ARRVAL_P(op))?1:0);zval_dtor(op);Z_LVAL_P(op) = tmp;break;case IS_OBJECT:{int retval = 1;TSRMLS_FETCH();convert_object_to_type(op, IS_LONG, convert_to_long);if (Z_TYPE_P(op) == IS_LONG) {return;}zend_error(E_NOTICE, "Object of class %s could not be converted to int", Z_OBJCE_P(op)->name);zval_dtor(op);ZVAL_LONG(op, retval);return;}default:zend_error(E_WARNING, "Cannot convert to ordinal value");zval_dtor(op);Z_LVAL_P(op) = 0;break;}Z_TYPE_P(op) = IS_LONG;
}

该函数首先获取类型,在进行不同的处理
19行,如果是 IS_DOUBLE类型,则会进行强制转换# define zend_dval_to_lval(d) ((long) (d))
21-27行,会调用 C函数 strtol将其转换成long类型
29-33行,如果是数组类型,会获取数组的个数,如果有值则将其设置为1,否则为0.这就是我们数组里有N个键和值,为什么返回还是1的原因:
不管 数组键值有多少个,只要有值,就为1.
34-49行,如果是对象呢,那就会先调用convert_to_long其强制转换为long,否则抛出异常,返回1.
如果没有返回类型则会返回0.

原文出处:http://imsiren.com/archives/520

PHP内核函数研究之 intval相关推荐

  1. linux应用调用内核函数,Hooking linux内核函数(一):寻找完美解决方案

    前言 我们最近参与了一个Linux系统安全相关项目,需要hooking几个重要的Linux内核函数调用,例如打开文件和启动进程,并利用它来启用系统活动监控并抢先阻止可疑进程. 最后,我们发明了一种有效 ...

  2. Windows内核函数的命名

    <Windows内核情景分析--采用开源代码ReactOS(上.下册)>本书通过分析ReactOS的源代码介绍了Windows内核各个方面的结构.功能.算法与具体实现.本小节为大家介绍Wi ...

  3. Windows 驱动发展基金会(九)内核函数

    Windows 驱动发展基金会系列,转载请注明出处:http://blog.csdn.net/ikerpeng/article/details/38849861 这里主要介绍3类Windows的内核函 ...

  4. (49)逆向分析KiSystemService/KiFastCallEntry调用内核函数部分(SST,SSDT,SSPT)

    一.回顾 前两篇博客,我逆向分析了 KiSystemService 和 KiFastCallEntry 填充_KTRAP_FRAME 结构体的代码,二者大同小异,主要的区别是 sysenter 只改了 ...

  5. linux下的系统调用函数到内核函数的追踪

    Original from: http://blog.chinaunix.net/uid-28458801-id-3468966.html 使用的 glibc : glibc-2.17 使用的 lin ...

  6. 内核函数 系统调用 系统命令 库函数

    内核函数 运行在内核态的,一般来说特权级较高. 系统调用 系统调用是程序进入内核函数的接口层,大量的内核函数被封装再系统调用中.再进入不同的系统调用之后,系统调用中的内核函数被称为该系统调用的服务例程 ...

  7. docker编译Linux内核,c – 如何编译在docker中使用内核函数的C代...

    我有一个Makefile,一些使用PCI设备的C代码 all: g++ -o executable main.cpp dragon.pb.cc -std=c++11 -O3 -I/usr/includ ...

  8. php thread linux,Linux_linux内核函数kernel_thread,设备驱动程序中,如果需要几 - phpStudy...

    linux内核函数kernel_thread 设备驱动程序中,如果需要几个并发执行的人物,可以启动内核线程,启动内和县城的函数为: int kernel_thread (int ( * fn )( v ...

  9. Windows内核函数

    字符串处理 在驱动中一般使用的是ANSI字符串和宽字节字符串,在驱动中我们仍然可以使用C中提供的字符串操作函数,但是在DDK中不提倡这样做,由于C函数容易导致缓冲区溢出漏洞,针对字符串的操作它提供了一 ...

最新文章

  1. 你给你的Typore配置图床了吗?没有的话,就来看Typora配置图床吧!!!放心不用付费滴!!
  2. openssl生成https证书 (转)
  3. c盘java文件误删_java获取C盘下的隐藏目录文件名称
  4. 18Python标准库系列之logging模块
  5. Java基础学习(4)-动态代理
  6. 电子电路设计的基础知识
  7. 软件测试基本流程【车机测试】
  8. FT232R国产替代GP232RLUSB2.0串口芯片
  9. diskgenius克隆硬盘无法启动_克隆硬盘
  10. 大数据常见面试题总结,有问必答
  11. div 设置a4大小_A4纸网页打印 html网页页面的宽度设置成多少
  12. 最新版(2019.3.23)荣耀paly真机调试(Android stdio)
  13. 数据库发展史 特性,安装区别
  14. 汇编语言复习~作业一(下)
  15. 关于Explaining and harnessing adversarial examples的理解
  16. 项目管理进阶--软件开发项目中的团队组成
  17. React组件开发流程——利用React构建简单的可检索产品数据表
  18. MDK5__配色方案
  19. Obsidian学习从0到1 —— 使用技巧
  20. 漂亮、免费的CSS模板

热门文章

  1. 华为HCIP-DATACOM题库解析
  2. 路由与交换-华为eNSP-单区域ospf综合配置
  3. 〖Python自动化办公篇⑥〗- word文件自动化 - word操作与读取word文件
  4. NLP14-基于Gensim中的Doc2Vec的试探
  5. 《音视频开发进阶指南:基于Android与iOS平台的实践》源码下载地址
  6. 顶级干货 | 海量优质资源,满足你的一切需求!!
  7. 如何规避微信公众号交易市场的风
  8. 使用tinyMediaManager整理电影和电视文件
  9. GBase 8s 事务管理
  10. 大数据平台数据治理与建设方案(附84页PPT)