PHP。通过引用和字符串传递变量。如何处理这两个不同的论点?

时间:2012-10-05 23:49:09

标签: php pass-by-reference

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

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

问题是我希望这个函数也接受一个变量的字符串。但PHP返回时发生致命错误( PHP致命错误:只有变量可以通过引用传递给... )。在代码中, 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;
}

2 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:0)

在没有编写@newfurniturey之类的附加功能的情况下,做你要求的唯一方法就是简单地打开和解析你的函数被称为文本的文件(例如用fopen),使用数据来自debug_backtrace。这在性能方面会很昂贵,但如果仅用于调试目的则可能没问题;并且使用此方法,您将不再需要函数中的引用,这意味着您可以自由地接受文字作为参数。