PHP核心函式研究之 intval

2021-08-26 19:40:25 字數 1963 閱讀 8214

宣告:本文為斯人

原創,全部為作者一一分析得之,有不對的地方望賜教。

趁熱打鐵 順便說說 intval函式.該函式好像我們用的最多的就是在post或者get某個引數的時候,將其強制轉換為int型,

為了保證我們傳入到sql的時候是乙個整形.,當然這只是其中一種用法..

該函式接受兩個引數,第乙個是要轉換的字串,第二個要轉換成的進製數,預設為十進位制.

我們先用php 來看看它的用法.

class a } $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) base = 10; break; case 2: if (zend_parse_parameters(zend_num_args() tsrmls_cc, "zl", &num, &arg_base) == failure) 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) /* /* 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: 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: 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.

原文出處:

原 PHP核心函式研究之 global

宣告 本文為斯人原創,全部為作者一一分析得之,有不對的地方望賜教。好久沒有寫部落格了 最近事挺多,換了工作,又搬了家.今天就來說說 我們經常用到的global語句吧.我們都知道,在函式體內宣告的變數,作用域只是當前函式體中,一般情況下是訪問不到外部宣告的變數的.因為全域性變數和區域性變數存放在不同的...

原 PHP核心研究 函式的定義

宣告 本文為斯人原創,全部為作者一一分析得之,有不對的地方望賜教。php技術部落格 在csdn也會同步更新的哦.php中,函式的定義 是用關鍵字 function來定義的.function hello str 在 zend zend language parse.y中找到 關鍵字 t functio...

PHP 核心特性之匿名函式

提出 在匿名函式出現之前,所有的函式都需要先命名才能使用 function increment value array map increment 1,2,3 有的時候函式可能只需要使用一次,這時候使用匿名函式會使得 更加簡潔直觀,同時也避免了函式在其他地方被使用 array map functio...