日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
從源碼角度看PHP字符串類型轉(zhuǎn)換

PHP 的類型轉(zhuǎn)換是比較方便的,但是越是容易使用的東西,底層的實(shí)現(xiàn)越是復(fù)雜,而且在使用中像我這樣的新手也往往不清楚轉(zhuǎn)換后的結(jié)果到底是什么。有時(shí)候,對(duì)于 Java 這種強(qiáng)類型的語(yǔ)言,使用的時(shí)候需要強(qiáng)制進(jìn)行轉(zhuǎn)換,這樣多半轉(zhuǎn)換后的結(jié)果是可以預(yù)料的,至少自己是想這么做的。

通過實(shí)例看轉(zhuǎn)換

寫個(gè)關(guān)于 PHP 類型轉(zhuǎn)換的代碼測(cè)試一下吧,看看大家是否能知道輸出結(jié)果。把 各種數(shù)據(jù)類型 都轉(zhuǎn)換為 字符串類型試試。

$var = false;
echo '$var:', $var, "\r\n";
$var = null;
echo '$var:', $var, "\r\n";
$var = true;
echo '$var:', $var, "\r\n";
$var = 1;
echo '$var:', $var, "\r\n";
$var = 1.1;
echo '$var:', $var, "\r\n";
$var1 = &$var;
echo '$var:', $var1, "\r\n";
$var1 = 'string111';
echo '$var:', $var1, "\r\n";
$var = [1, 2, 3];
echo '$var:', $var, "\r\n";
class Obj
{
private $field;
}
$var = new Obj();
echo '$var:', $var, "\r\n";

代碼很簡(jiǎn)單,大家可以猜猜輸出結(jié)果,然后再和運(yùn)行結(jié)果比對(duì)一下,運(yùn)行結(jié)果如下:

$ php string.php
$var:
$var:
$var:1
$var:1
$var:1.1
$var:1.1
$var:string111
$var:
Notice: Array to string conversion in C:\Users\Administrator\Desktop\string.php
on line 24
Call Stack:
0.0010 405568 1. {main}() C:\Users\Administrator\Desktop\string.php:0
Array
$var:
Catchable fatal error: Object of class Obj could not be converted to string in C
:\Users\Administrator\Desktop\string.php on line 32
Call Stack:
0.0010 405568 1. {main}() C:\Users\Administrator\Desktop\string.php:0

不知道是否實(shí)際的運(yùn)行結(jié)果和猜測(cè)的結(jié)果是否一致。

PHP 源碼中各類型轉(zhuǎn)換為字符串類型的處理

對(duì)于各種類型之間的賦值,并轉(zhuǎn)換為字符串,使用真的是非常的方便。但是,實(shí)際的功勞都是 PHP 底層的復(fù)雜處理??匆幌玛P(guān)于各種類型轉(zhuǎn)換為字符串類型的源代碼的處理。

ZEND_API zend_string* ZEND_FASTCALL _zval_get_string_func(zval *op) /* {{{ */
{
try_again:
switch (Z_TYPE_P(op)) {
case IS_UNDEF:
case IS_NULL:
case IS_FALSE:
return ZSTR_EMPTY_ALLOC();
case IS_TRUE:
return ZSTR_CHAR('1');
case IS_RESOURCE: {
char buf[sizeof("Resource id #") + MAX_LENGTH_OF_LONG];
int len;
len = snprintf(buf, sizeof(buf), "Resource id #" ZEND_LONG_FMT, (zend_long)Z_RES_HANDLE_P(op));
return zend_string_init(buf, len, 0);
}
case IS_LONG: {
return zend_long_to_str(Z_LVAL_P(op));
}
case IS_DOUBLE: {
return zend_strpprintf(0, "%.*G", (int) EG(precision), Z_DVAL_P(op));
}
case IS_ARRAY:
zend_error(E_NOTICE, "Array to string conversion");
return zend_string_init("Array", sizeof("Array")-1, 0);
case IS_OBJECT: {
zval tmp;
if (Z_OBJ_HT_P(op)->cast_object) {
if (Z_OBJ_HT_P(op)->cast_object(op, &tmp, IS_STRING) == SUCCESS) {
return Z_STR(tmp);
}
} else if (Z_OBJ_HT_P(op)->get) {
zval *z = Z_OBJ_HT_P(op)->get(op, &tmp);
if (Z_TYPE_P(z) != IS_OBJECT) {
zend_string *str = zval_get_string(z);
zval_ptr_dtor(z);
return str;
}
zval_ptr_dtor(z);
}
zend_error(EG(exception) ? E_ERROR : E_RECOVERABLE_ERROR, "Object of class %s could not be converted to string", ZSTR_VAL(Z_OBJCE_P(op)->name));
return ZSTR_EMPTY_ALLOC();
}
case IS_REFERENCE:
op = Z_REFVAL_P(op);
goto try_again;
case IS_STRING:
return zend_string_copy(Z_STR_P(op));
EMPTY_SWITCH_DEFAULT_CASE()
}
return NULL;
}
/* }}} */

從上面的源碼中可以看出,對(duì)于類型的轉(zhuǎn)換,PHP 底層的源碼使用了 switch ... case 的結(jié)構(gòu),在進(jìn)行轉(zhuǎn)換的時(shí)候需要對(duì)逐個(gè)的類型進(jìn)行匹配后,再進(jìn)行轉(zhuǎn)換。當(dāng)然,從源碼的角度去看待上面的 PHP 類型轉(zhuǎn)換的代碼就非常的清晰明了了。

最后

讀 PHP 的源碼有一段時(shí)間了,進(jìn)度比較慢,說(shuō)實(shí)話,對(duì)于寫 PHP 的代碼沒有什么提高,或者對(duì)我來(lái)說(shuō)沒有遇到什么讓我提高的地方。單純的出于對(duì)知識(shí)求甚解的原因吧。


當(dāng)前題目:從源碼角度看PHP字符串類型轉(zhuǎn)換
網(wǎng)頁(yè)URL:http://www.dlmjj.cn/article/dhpcidc.html