Прямо: я хочу написать код, который сообщает, была ли переменная передана по ссылке или нет. Например:
<?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
.