设为首页 收藏本站
查看: 869|回复: 0

[经验分享] PHP内核函数研究之 intval

[复制链接]

尚未签到

发表于 2017-4-3 14:41:25 | 显示全部楼层 |阅读模式
  
声明:本文为
斯人
原创,全部为作者一一分析得之,有不对的地方望赐教。

欢迎转载,转载请注明出处 。

本文地址:
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

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-359709-1-1.html 上篇帖子: 2011-1-1---------------mage.php -----------函数分析!!! 下篇帖子: PHP生成高质量的缩略图
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表