作者:狼与鹰的爱_340 | 来源:互联网 | 2013-06-17 09:19
前面有一篇文章 讲的是 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等函数也在这里.
1
2
3
4
|
PHP_FUNCTION(is_null)
{
php_is_type(INTERNAL_FUNCTION_PARAM_PASSTHRU, IS_NULL);
}
|
它调用了 php_is_type函数,该函数 后面传递的是要检测的类型.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
staticvoidphp_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”
也就是说必须是一个类的实例化才行.