原:PHP数组函数研究:is_null,is_object,is_array,is_string,is_resource等

声明:本文为 斯人原创,全部为作者一一分析得之,有不对的地方望赐教。
欢迎转载,转载请注明出处 。
本文地址: 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”
也就是说必须是一个类的实例化才行.


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值