成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

從源碼角度看 PHP 字符串類型轉換

開發 前端
寫個關于 PHP 類型轉換的代碼測試一下吧,看看大家是否能知道輸出結果。

PHP 的類型轉換是比較方便的,但是越是容易使用的東西,底層的實現越是復雜,而且在使用中像我這樣的新手也往往不清楚轉換后的結果到底是什么。有時候,對于 Java 這種強類型的語言,使用的時候需要強制進行轉換,這樣多半轉換后的結果是可以預料的,至少自己是想這么做的。

通過實例看轉換

寫個關于 PHP 類型轉換的代碼測試一下吧,看看大家是否能知道輸出結果。把 各種數據類型 都轉換為 字符串類型試試。

<?php
$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";

代碼很簡單,大家可以猜猜輸出結果,然后再和運行結果比對一下,運行結果如下:

$ 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

不知道是否實際的運行結果和猜測的結果是否一致。

PHP 源碼中各類型轉換為字符串類型的處理

對于各種類型之間的賦值,并轉換為字符串,使用真的是非常的方便。但是,實際的功勞都是 PHP 底層的復雜處理。看一下關于各種類型轉換為字符串類型的源代碼的處理。

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;
}
/* }}} */

從上面的源碼中可以看出,對于類型的轉換,PHP 底層的源碼使用了 switch ... case 的結構,在進行轉換的時候需要對逐個的類型進行匹配后,再進行轉換。當然,從源碼的角度去看待上面的 PHP 類型轉換的代碼就非常的清晰明了了。

最后

讀 PHP 的源碼有一段時間了,進度比較慢,說實話,對于寫 PHP 的代碼沒有什么提高,或者對我來說沒有遇到什么讓我提高的地方。單純的出于對知識求甚解的原因吧。

責任編輯:姜華 來源: 今日頭條
相關推薦

2019-04-28 16:10:50

設計Redux前端

2020-02-04 09:53:05

數據安全數據泄漏信息安全

2009-12-11 13:16:04

PHP查詢字符串

2015-05-05 11:04:31

CoreOS自動化運維

2022-07-15 13:01:13

Kotlin編程語言Java

2020-12-14 08:03:52

ArrayList面試源碼

2020-12-17 08:03:57

LinkedList面試源碼

2009-11-24 09:55:44

PHP字符串函數

2009-11-25 09:13:41

PHP數組轉字符串PHP字符串轉數組

2010-01-05 17:43:29

JSON字符串

2009-08-20 11:29:21

C#16進制字符串

2010-03-30 16:45:22

Oracle 字符串

2017-09-25 16:21:30

Spark on yacluster模式

2021-11-24 09:08:38

LeetCode字符串算法

2009-11-25 16:55:45

PHP函數explod

2009-12-01 14:00:37

PHP字符串轉換為數值

2009-11-18 12:38:04

PHP字符串函數

2009-12-01 10:38:08

PHP字符串函數

2009-06-05 11:16:58

字符串動態轉換

2023-10-27 07:03:22

字符串String類型
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久国产婷婷国产香蕉 | 九九九久久国产免费 | 欧美日韩一二三区 | 91综合在线观看 | 久久激情网 | 伊人色综合久久天天五月婷 | 国产一区二区三区在线 | 欧美日韩综合 | 北条麻妃99精品青青久久 | 午夜在线免费观看视频 | 久久久久久久久久影视 | 亚洲va欧美va天堂v国产综合 | 国产免费又色又爽又黄在线观看 | 久久国内精品 | 黄色在线免费播放 | 美女三区| 99精品一区二区 | 亚洲综合二区 | 午夜激情小视频 | 久久久久久久久久性 | 亚洲视频一区二区三区 | 户外露出一区二区三区 | 日韩一区二区精品 | 毛片一区二区三区 | 国产伦一区二区三区四区 | 一区二区视频在线 | 国产一区二区三区四区三区四 | 国产激情精品一区二区三区 | 国产欧美一区二区三区日本久久久 | 亚洲bt 欧美bt 日本bt | 国产日韩欧美中文字幕 | 欧美1级| 国产做a爱免费视频 | 久久成人免费视频 | 日日干夜夜操 | 亚洲一区二区精品视频在线观看 | 久热国产在线 | 国产视频一区在线 | 中文二区 | 荷兰欧美一级毛片 | 91久久久精品国产一区二区蜜臀 |