Как проверить, была ли переменная передана по ссылке в 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 делает. Если кто-то знает разницу между bindParam и bindValue в PDO, они знают, что это обходной путь этого вопроса. Я могу просто сделать две функции, но мне интересно, возможно ли это с одним.

Заранее спасибо.

Вот как это сделать, не используя функцию 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 ).

Вы можете использовать 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 .