原:PHP数组函数研究:is_null,is_object,is_array,is_string,is_resource等
2012-04-08 21:52
656 查看
声明:本文为斯人原创,全部为作者一一分析得之,有不对的地方望赐教。
欢迎转载,转载请注明出处 。
本文地址:http://imsiren.com/archives/516
前面有一篇文章 讲的是 PHP内核源码分析:isset与
empty
但是好像忘记了一系列is函数
如
is_null,is_object,is_array,is_string,is_resource,is_bool,is_long,is_float
今天就补充一下..他们的判断方法是一样的,只讲一个is_null其他的就能明白了.
is_null是一个函数.定义在 ext/standard/type.c文件中.
所有 类型的操作都在这个文件里,settype,gettype,intval等函数也在这里.
它调用了 php_is_type函数,该函数 后面传递的是要检测的类型.
第九行 会调用 Z_TYPE_PP来获取传递进来的值的类型..前面文章有讲到.
如果不等于该函数的第二个参数type直接返回FALSE;
如果等于我们要检测的类型,但是 对象或者是资源 就还要做相应的判断.
是对象的话,十六行会获取 _zend_class_entry 结构的name值,该值必须等于INCOMPLETE_CLASS
INCOMPLETE_CLASS是一个宏,
#define INCOMPLETE_CLASS “__PHP_Incomplete_Class”
也就是说必须是一个类的实例化才行.
原文出处:http://imsiren.com/archives/516
欢迎转载,转载请注明出处 。
本文地址:http://imsiren.com/archives/516
前面有一篇文章 讲的是 PHP内核源码分析:isset与
empty
但是好像忘记了一系列is函数
如
is_null,is_object,is_array,is_string,is_resource,is_bool,is_long,is_float
今天就补充一下..他们的判断方法是一样的,只讲一个is_null其他的就能明白了.
is_null是一个函数.定义在 ext/standard/type.c文件中.
所有 类型的操作都在这个文件里,settype,gettype,intval等函数也在这里.
PHP_FUNCTION(is_null) { php_is_type(INTERNAL_FUNCTION_PARAM_PASSTHRU, IS_NULL); }
它调用了 php_is_type函数,该函数 后面传递的是要检测的类型.
staticvoid php_is_type(INTERNAL_FUNCTION_PARAMETERS, inttype) { zval **arg; if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Z", &arg) == FAILURE) { RETURN_FALSE; } if(Z_TYPE_PP(arg) == type) { if(type == IS_OBJECT) { zend_class_entry *ce; if(Z_OBJ_HT_PP(arg)->get_class_entry == NULL) { /* if there's no get_class_entry it's not a PHP object, so it can't be INCOMPLETE_CLASS */ RETURN_TRUE; } ce = Z_OBJCE_PP(arg); if(!strcmp(ce->name, INCOMPLETE_CLASS)) { RETURN_FALSE; } } if(type == IS_RESOURCE) { char*type_name; type_name = zend_rsrc_list_get_rsrc_type(Z_LVAL_PP(arg) TSRMLS_CC); if(!type_name) { RETURN_FALSE; } } RETURN_TRUE; }else{ RETURN_FALSE; } }
第九行 会调用 Z_TYPE_PP来获取传递进来的值的类型..前面文章有讲到.
如果不等于该函数的第二个参数type直接返回FALSE;
如果等于我们要检测的类型,但是 对象或者是资源 就还要做相应的判断.
是对象的话,十六行会获取 _zend_class_entry 结构的name值,该值必须等于INCOMPLETE_CLASS
INCOMPLETE_CLASS是一个宏,
#define INCOMPLETE_CLASS “__PHP_Incomplete_Class”
也就是说必须是一个类的实例化才行.
原文出处:http://imsiren.com/archives/516
相关文章推荐
- 原:PHP数组函数研究:is_null,is_object,is_array,is_string,is_resource等
- php中empty(), is_null(), isset()函数区别
- PHP数组的交集array_intersect(),array_intersect_assoc(),array_inter_key()函数详解
- php数组函数array_key_exists()小结
- php中函数 isset(), empty(), is_null() 的区别
- PHP数组排序函数array_multisort()函数详解(一)
- php-Arrays 函数-array_diff_ukey-用回调函数对键名比较计算数组的差集
- PHP - Manual手册 - V. Array 数组函数 - array_intersect计算数组的交集
- PHP删除Array数组里指定的key(完整版,已封装成函数,附测试代码)
- PHP:数组操作函数array_walk()和array_map()
- vb 使用Array.ConvertAll将object类型数组转为string类型数组
- php数组函数序列之array_splice() - 在数组任意位置插入元素
- php 自己写的一个数组分类合并array_merge(函数的剖析)
- PHP数组唯一函数array_unique对二维数组的处理
- php基础知识【函数】(1)数组array
- php 对象转数组 objectToArray
- php-Arrays 函数-array_unshift-在数组开头插入一个或多个单元
- php使用array_rand()函数从数组中随机选择一个或多个元素
- php数组查找函数in_array()、array_search()、array_key_exists()使用实例
- php统计数组中各项的个数用函数array_count_values