2014-02-22 47 views
4

直截了當: 我想編寫一些代碼,告訴您是否通過引用傳遞變量。 例如:如何檢查變量是否通過PHP中的引用傳遞

<?php 
function isReference($variable) { 
    //return TRUE if &$something was passed 
    //return FALSE if $something was passed 
} 
$text = 'Anything'; 
$a = isReference(&$text); //return TRUE 
$b = isReference($test); //return FALSE 
?> 

對於那些誰是好奇 - 爲什麼需要它?首先我不喜歡留下未解決的問題。 其次,我現在正在通過寫一個擴展到mysqli來增強技能,這將準備類似於PDO的語句。如果有人知道PDO中bindParam和bindValue的區別,他們知道這是這個問題的解決方法。我只能做兩個功能,但我想知道是否有可能。

在此先感謝。

+7

FWIW,調用時通過引用傳遞已被棄用在5.3和5.4去除。你不應該在新代碼中使用它,你的API當然不應該依賴它的存在。 – lonesomeday

+0

如果可以使用一個函數,我會假設PDO會這樣做,對吧? –

+0

也許PDO的創建者有很好的理由不這樣做。 無論如何,我剛剛瞭解到,通過引用的引用時間已被棄用,這是非常有幫助的。謝謝你寂寞。 – Drikam

回答

5

這裏有一個辦法做到這一點不使用debug_zval_dump功能:

function isReference($variable) { 
    $variable = array($variable); 
    $arg = func_get_arg(0); 
    $isRef = isset($arg[0]) && $arg === array($variable[0]); 
    $variable = $variable[0]; 

    return $isRef; 
} 

注:只有一個單一的情況下,這將不起作用:

$text = array(&$text); // although i don't see why such a structure could be used 
isReference($text); // will wrongly return false 

很明顯,你可以繞過這個限制通過使用隨機唯一密鑰(而不是0)。

0

您可以使用debug_zval_dump轉儲內部zend值的字符串表示輸出:

function isRef(&$val) { 
    ob_start(); 
    debug_zval_dump(&$val); 
    $ret = ob_get_clean(); 
    preg_match('~refcount\((\d+)\)~', $ret, $matches); 
    return $matches[1] - 4; 
} 

$var1 = 'Var1'; 
$var2 = &$var1; // passed by ref 
if(isRef($var2)) echo 'Passed by ref'; 

但要注意的PHP - 5.4

+0

有趣的想法,但我不能批准它。在多個地方和版本中進行檢查,包括但不限於[onlinephpfunctions](http://sandbox.onlinephpfunctions.com/)網站。此外,即使我得到此代碼的工作,isRef($ var1)返回TRUE,當預期的結果是FALSE(和$ var1不是拼寫錯誤)。 是的,我知道這個版本在這裏有很大的影響。 – Drikam

+1

是的,這不是一個合適的解決方案,我不知道任何想法,反正:-) –

0

只需檢查默認值似乎在我的測試中工作正常。顯然,它不會工作,如果$t已被設置爲'x',但你可以在默認值更改爲一些完全不可能解決此:

function test(&$t='x'){ 
    if($t!='x') $t = 2; 
} 
test(); echo $t; //outputs: null 
test($t); echo $t; //outputs: 2