0

我正在编写自己的调试函数,我需要一些帮助来修复下面的代码。

我正在尝试打印一个变量及其名称、声明变量和函数的文件以及函数调用的行。我做的第一部分,变量、变量名、文件和行打印正确。在代码中,a($variable)效果很好。

问题是我希望这个函数也接受一个字符串,来自一个变量。但是 PHP 返回一个致命错误(PHP Fatal error: Only variables can be pass by reference in ...)。在代码中,a('text out')

那么,如何修复此代码以正确接受变量或字符串?

代码(已编辑):

function a(&$var){
    $backtrace = debug_backtrace();
    $call = array_shift($backtrace);

    $line = $call['line'];
    $file = $call['file'];

    echo name($var)."<br>".$var."<br>".$line."<br>".$file;
}

$variable='text in';
a($variable);
a('text out');

我需要通过引用传递变量才能在下面使用此函数(该函数正确获取变量名称,也适用于数组):

function name(&$var, $scope=false, $prefix='unique', $suffix='value'){
   if($scope) $vals = $scope;
   else      $vals = $GLOBALS;
   $old = $var;
   $var = $new = $prefix.rand().$suffix;
   $vname = FALSE;
   foreach($vals as $key => $val) {
      if($val === $new) $vname = $key;
   }
   $var = $old;
   return $vname;
}
4

2 回答 2

1

您的代码当前实现的方式在pass by reference设计上是完美的,但设计上也不能更改为具有两种a()方法 - 一种通过引用接受变量,另一种作为字符串文字。

如果确实需要传递字符串文字而不是首先将其分配给变量,我建议创建第二个名为的便捷方法a_str(),该方法实际上接受字符串文字而不是引用变量。此方法的唯一目的是将变量传递给原始a()方法 - 从而声明要通过引用传递的变量。

function a_str($var) {
    a($var);
}

唯一要记住的是,a($variable);通过引用传递和a_str('some text');不传递时使用。

这是您的name()函数的相同便捷方法:

function name_str($var, $scope=false, $prefix='unique', $suffix='value'){
    return name($var, $scope, $prefix, $suffix);
}
于 2012-10-06T01:18:22.390 回答
0

在不编写像@newfurniturey 建议的附加函数的情况下完成您所要求的唯一方法是简单而简单地打开和解析您的函数作为文本调用的文件(例如使用fopen),使用来自debug_backtrace. 这在性能方面会很昂贵,但如果仅用于调试目的可能还可以;并且使用此方法,您将不再需要函数中的引用,这意味着您可以自由地接受文字作为参数。

于 2012-10-06T01:34:57.417 回答