0

私は独自のデバッグ機能を書いていますが、以下のコードを修正するために助けが必要です。

変数とその名前、変数と関数が宣言されたファイル、および関数呼び出しの行を出力しようとしています。私が行った最初の部分、変数、変数名、ファイル、および行は正しく出力されます。コードでは、a($variable)はうまく機能します。

問題は、この関数が変数から文字列も受け入れることです。しかし、PHP は致命的なエラー ( PHP Fatal error: Only variables can 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()参照によって変数を受け入れる方法と文字列リテラルとして受け入れる方法の 2 つの方法を持つように変更することもできません。

最初に変数に代入する代わりに文字列リテラルを渡すことが本当に必要な場合はa_str()、変数の参照ではなく文字列リテラルを実際に受け入れるという名前の 2 番目の便利なメソッドを作成することをお勧めします。このメソッドの唯一の目的は、変数を元の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 に答える