其中parameter下有這樣一句話: Note: Note that the parameters " /> www.av一区,欧美又粗又长又大AAAA片,中文字幕一区中文亚洲

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

由php的call_user_func傳reference引發的思考

問題的提出
網友bercmisir在院內留言,針對php手冊中的call_user_func函數的文檔一事,大致如下:
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.

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

還有一個例子:
復制代碼 代碼如下:
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

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

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

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

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

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

分析源碼
有人說:在php中寫入,everything is a reference。
查閱php源碼,在./Zend/zend_compile.c的1579行有函數定義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使用的地方,可以發現是在parser階段時,根據參數ZVAL結構體中元素的定義,來傳遞到底是var還是value還是reference。(php5.2.13 ./Zend/zend_language_parser.y/c 451/3593)

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

php技術由php的call_user_func傳reference引發的思考,轉載需保留來源!

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

主站蜘蛛池模板: 精品久久久久中文字幕加勒比东京热 | 欧美精品成人一区二区在线观看 | 亚洲在线视频自拍精品 | 欧美白人极品性喷潮 | 亚洲精品一本之道高清乱码 | couo福利姬图库 | 国产精品第1页 | 久久超碰国产精品最新 | 菠萝菠萝蜜免费播放高清 | 韩日午夜在线资源一区二区 | 欧美日本高清动作片www网站 | 亚洲精品高清视频 | 最近中文字幕高清中文 | 国产亚洲精品久久久久久禁果TV | 国产成人片视频一区二区青青 | 在线观看日韩一区 | 国产亚洲日韩另类在线播放 | 久久精品一卡二卡三卡四卡视频版 | 欧美ⅹxxxx18性欧美 | 欧美日韩一二区旡码高清在线 | 一区二区不卡在线视频 | 最近韩国日本免费观看mv免费版 | 在线a视频| 国产 亚洲 中文在线 字幕 | 欧美精品亚洲精品日韩专区一 | 二级毛片免费观看全程 | 国产亚洲精品久久久久久久软件 | 动漫美女人物被黄漫在线看 | 99热在线精品视频 | 亚洲精品人成电影网 | 神马电影院午 夜理论 | 天堂Av亚洲欧美日韩国产综合 | 永久免费的无码中文字幕 | 国产精品日本不卡一区二区 | 艺术片 快播 | 野花高清影视免费观看 | 久久人人玩人妻潮喷内射人人 | 亚洲精品无码国产爽快A片 亚洲精品无码成人AAA片 | 最新果冻传媒在线观看免费版 | 一本之道高清在线3线观看 一本之道高清视频在线观看 | 国产自拍视频在线一区 |