其中parameter下有這樣一句話: Note: Note that the parameters " /> 国产免费人成在线看视频,热re99久久精品国99热,露露的性战k8经典

天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

由php的call_user_func傳reference引發(fā)的思考

問題的提出
網(wǎng)友bercmisir在院內(nèi)留言,針對php手冊中的call_user_func函數(shù)的文檔一事,大致如下:
http://php.NET/manual/en/function.call-user-func.php

其中parameter下有這樣一句話:
Note: Note that the parameters for call_user_func() are not passed by reference.

簡單地翻譯一下,是說這個(gè)函數(shù)的參數(shù)是不能依靠引用來傳遞的。

還有一個(gè)例子:
復(fù)制代碼 代碼如下:
error_reporting(E_ALL);
function increment(&$var)
{
$var++;
}
$a = 0;
call_user_func('increment', $a);
echo $a."/n";
call_user_func_array('increment', array(&$a)); // You can use this instead before php 5.3
echo $a."/n";
?>

輸出是:
0
1

而網(wǎng)友bercmisir的問題在于:
call_user_func('increment', $a);輸出是0,而call_user_func('increment', &$a);卻輸出是1,明明說不能依靠引用來傳遞。

尋根溯源
然后再進(jìn)一步尋根溯源,這個(gè)Note的信息其實(shí)是http://bugs.php.NET/bug.php?id=24931這個(gè)bug中最后處理的結(jié)果。
并且在call_user_func('increment', &$a);雖然輸出了1的結(jié)果,但一般情況下,會有一個(gè)警告信息:Deprecated: Call-time pass-by-reference has been deprecated。

這是什么原因呢?
先看一個(gè)例子:
復(fù)制代碼 代碼如下:
error_reporting(E_ALL);
function increment(&$var)
{
$var++;
}
$x = 1;
increment($x);
echo $x;
?>

結(jié)果為2,并且沒有類似expected to be a reference, value given的警告信息,相反地,如果將第8行代碼修改為&$x,將得到一個(gè)廢除警告。從而得以驗(yàn)證,其實(shí)php在傳遞過程中,變量會根據(jù)形參需要的到底是引用還是值來自行決定傳輸?shù)氖且眠€是值,并不需要顯式地傳遞(相反顯式傳遞是即將被廢除的)。

繼續(xù)深入
http://www.php.NET/manual/en/language.references.pass.php
php手冊中,介紹引用的傳遞一節(jié),在中間位置有一個(gè)Note說到:在函數(shù)調(diào)用時(shí)是不需要傳引用的(也就是上節(jié)所說的顯式調(diào)用),在5.3中如果顯式調(diào)用會出來一個(gè)廢除警告。

分析源碼
有人說:在php中寫入,everything is a reference。
查閱php源碼,在./Zend/zend_compile.c的1579行有函數(shù)定義zend_do_pass_param。(php5.2.13)

其中有這樣一句判斷:
if (original_op == ZEND_SEND_REF && !CG(allow_call_time_pass_reference)) {打印廢除警告。}
大概意思就是說,在傳遞的是引用,并且php.ini的allow_call_time_pass_reference為否的話,打印警告。
再看zend_do_pass_param使用的地方,可以發(fā)現(xiàn)是在parser階段時(shí),根據(jù)參數(shù)ZVAL結(jié)構(gòu)體中元素的定義,來傳遞到底是var還是value還是reference。(php5.2.13 ./Zend/zend_language_parser.y/c 451/3593)

結(jié)論
引用其實(shí)類似linux里的文件硬鏈接一樣,但和C語言中的指針是不相同的,在parser階段php會根據(jù)上下文環(huán)境自行判斷是傳引用還是值。而本文所提到的call_user_function并不會自行判斷傳的是引用還是值。所以前面的例子call_user_function在傳值的時(shí)候不管用,而在傳引用的時(shí)候得出了正確結(jié)果(但其實(shí)還有一個(gè)廢除警告)。

php技術(shù)由php的call_user_func傳reference引發(fā)的思考,轉(zhuǎn)載需保留來源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 产传媒61国产免费 | 超碰在线观看 | 精品国产乱码久久久久久上海公司 | jizz国产丝袜18老师美女 | 免费果冻传媒2021在线观看 | yellow在线观看免费高清的日本 | 免费色片播放器 | 欧美午夜理伦三级在线观看 | 国内精品免费久久影院 | max girls 大感谢祭 | 99热都是精品 | 亚洲色噜噜狠狠网站 | 99精产国品一二产区在线 | 亚洲综合国产精品 | 国产系列在线亚洲视频 | 中国xxxxxx片免费播放 | 国产人妖一区二区 | 一边捏奶头一边啪高潮会怎么样 | 午夜日本大胆裸艺术 | 双性将军粗壮H灌满怀孕 | 国产成人女人在线视频观看 | 国产成人自拍视频在线观看 | 果冻传媒视频在线观看完整版免费 | 亚洲最大在线视频 | 欧美日韩另类在线观看视频 | 精品国产午夜福利在线观看蜜月 | 蜜臀AV99无码精品国产专区 | 高清午夜福利电影在线 | 久久午夜夜伦鲁鲁片无码免费 | 国产精品久久久久久无码专区 | 欧美18精品久久久无码午夜福利 | 黄色三级三级免费看 | 亚洲人成在线播放无码 | 含羞草国产亚洲精品岁国产精品 | 中文字幕人成人乱码亚洲AV | 人与禽物videos另类 | 浪荡女天天不停挨CAO日常视 | 日本精品久久久久中文字幕2 | 伊人久久大香线蕉综合色啪 | 性派对xxxhd 性啪啪chinese东北女人 | 国产揄拍国产精品 |