例如,如果我這樣做:PHP關閉中的use關鍵字是否通過引用傳遞?
function bar(&$var)
{
$foo = function() use ($var)
{
$var++;
};
$foo();
}
$my_var = 0;
bar($my_var);
將$my_var
進行修改?如果沒有,我怎樣才能在沒有添加參數到$foo
的情況下工作?
例如,如果我這樣做:PHP關閉中的use關鍵字是否通過引用傳遞?
function bar(&$var)
{
$foo = function() use ($var)
{
$var++;
};
$foo();
}
$my_var = 0;
bar($my_var);
將$my_var
進行修改?如果沒有,我怎樣才能在沒有添加參數到$foo
的情況下工作?
不,他們沒有通過引用傳遞 - use
遵循類似的符號,如函數的參數。你可以驗證你自己與debug_zval_dump
功能的幫助下(Demo):
<?php
header('Content-Type: text/plain;');
function bar(&$var)
{
$foo = function() use ($var)
{
debug_zval_dump($var);
$var++;
};
$foo();
};
$my_var = 0;
bar($my_var);
echo $my_var;
輸出:
long(0) refcount(3)
0
一個全通全範圍工作的參考會有的引用次數1.寫你做到這一點通過定義用作傳遞按引用:
$foo = function() use (&$var)
它也可以創建遞歸這樣:
$func = NULL;
$func = function() use (&$func) {
$func();
}
根據定義,閉包幾乎是按值封閉的,而不是通過引用。您可能會「參考使用」通過在參數列表中添加&
:
function() use (&$var)
這可以例如3在anonymous functions manual page可以看出。
不,他們不通過引用傳遞。
function foo(&$var)
{
$foo = function() use ($var)
{
$var++;
};
$foo();
}
$my_var = 0;
foo($my_var);
echo $my_var; // displays 0
function bar(&$var)
{
$foo = function() use (&$var)
{
$var++;
};
$foo();
}
$my_var = 0;
bar($my_var);
echo $my_var; // displays 1
不,它不會被修改..這是在手冊中涵蓋 –