2008-11-17 68 views

回答

45

要通過使用call_user_func_array()引用傳遞,所述陣列中的參數必須是引用 - 它不依賴於函數定義它是否被通過引用傳遞。例如,這可以工作:

function toBeCalled(&$parameter) { 
    //...Do Something... 
} 

$changingVar = 'passThis'; 
$parameters = array(&$changingVar); 
call_user_func_array('toBeCalled', $parameters); 

有關更多信息,請參閱關於call_user_func_array() function documentation的註釋。

+7

這個方案投以嚴格的能...警告「不推薦使用:通話時傳遞的引用已被棄用」 – Archenoth 2013-03-17 20:51:37

+3

我不知道PHP的,但我的5.3.3服務器上的新版本當我使用`call_user_func(「函數」,&$參數)`我得到了棄用的消息。當我切換到`call_user_func_array`時,它解決了這個問題。所以然後我檢查了STRICT啓用,仍然沒有得到消息,所以我認爲這是一個可以接受的方式來做到這一點。 – Lightbulb1 2014-07-11 15:51:09

-2

除了您在此處使用不建議使用的功能。您將在PHP5中生成警告,使其不夠完美。

警告:不推薦使用通過引用的呼叫時間;如果您想通過引用來傳遞它,請修改運行時函數名稱的聲明。如果你想啓用呼叫時間通過引用,你可以設置allow_call_time_pass_reference爲真在你的INI文件中...

不幸的是,似乎沒有任何其他選項,我可以發現。

1

直接,也可能是不可能的 - 但是,如果你有控制兩個以上的功能要實現電話它的代碼 - 然後是一個工作,身邊有你可能找到適當。

您是否需要將有問題的變量嵌入到對象中?如果你這樣做的話,代碼會看起來(有點)像這樣。

function toBeCalled($par_ref) { 
    $parameter = $par_ref->parameter; 
    //...Do Something... 
    $par_ref->parameter = $parameter; 
} 

$changingVar = 'passThis'; 
$parembed = new stdClass; // Creates an empty object 
$parembed->parameter = array($changingVar); 
call_user_func_array('toBeCalled', $parembed); 

你看,PHP對象變量僅僅是一個參考對象的內容 ---所以,如果你傳遞一個對象給一個函數,任何改變,該功能使得在該對象的內容內容將反映在調用函數也可以訪問的內容中。

只要確保調用函數從來不分配給對象變量本身 - 或將導致功能,基本上失去參考。該功能所做的任何賦值語句必須嚴格爲至該對象的內容

0

這可以通過雙引用工作,當修改$ parameter變量時修改原始變量。

$a = 2; 
$a = toBeCalled($a); 
echo $a //50 

function toBeCalled(&$par_ref) { 
    $parameter = &$par_ref; 
    $parameter = $parameter*25; 
} 
相關問題