1

関数に渡されたパラメーターの名前を見つけようとしています。

これを行うために、debug_backtrace() を使用して、関数が呼び出されたファイルと行を取得しています。

次に、ファイルを開き、探している行が表示されるまで 1 行ずつ読み取ります。

$file = fopen($caller['file'], 'r' );
$line = 0;
while(($row = fgets($file)) !== false){
  $line++; 
  if($line == $caller['line']) break;
}      

fclose($file);

// $row is my line

だから今、私は次のような行を持っています:

my_function ($var1, some_other_function($othervar1, $othervar2));

そこから引数を抽出するにはどうすればよいですか? 次のような配列を取得したい:

array('$var1', 'some_other_function($othervar1, $othervar2)');
4

5 に答える 5

2

複雑な問題です。あなたの例でも、関数の2番目のパラメーターには名前がありません。これは、別の関数への呼び出しの戻り値であるためです。

コードをトークン化するためにtoken_get_all()を使用すると、結果をループして必要なものを取得することができます。

$tokens = token_get_all('<?php my_function($var1, some_other_function($othervar1, $othervar2)); ?>');

print_r($tokens);

収量:

Array
(
    [0] => Array
        (
            [0] => 372
            [1] => <?php 
            [2] => 1
        )

    [1] => Array
        (
            [0] => 307
            [1] => my_function
            [2] => 1
        )

    [2] => (
    [3] => Array
        (
            [0] => 309
            [1] => $var1
            [2] => 1
        )

    [4] => ,
    [5] => Array
        (
            [0] => 375
            [1] =>  
            [2] => 1
        )

    [6] => Array
        (
            [0] => 307
            [1] => some_other_function
            [2] => 1
        )

    [7] => (
    [8] => Array
        (
            [0] => 309
            [1] => $othervar1
            [2] => 1
        )

    [9] => ,
    [10] => Array
        (
            [0] => 375
            [1] =>  
            [2] => 1
        )

    [11] => Array
        (
            [0] => 309
            [1] => $othervar2
            [2] => 1
        )

    [12] => )
    [13] => )
    [14] => ;
    [15] => Array
        (
            [0] => 375
            [1] =>  
            [2] => 1
        )

    [16] => Array
        (
            [0] => 374
            [1] => ?>
            [2] => 1
        )

)

パーサートークンのリストを使用すると、その配列をループして、関数に渡されたパラメーターが何であるかを把握できます。それでも、への呼び出しは、Zend Engine が最終的に関数テーブルで検索し、存在する場合は関数を呼び出し、存在しない場合は致命的なエラーをスローするmy_function単なるトークンであるため、一般的すぎる可能性があります。T_STRING

于 2012-07-17T23:43:44.603 に答える
1

できるよ:

function my_func ($var, $callback) {
   $args = func_get_args();
   call_user_func($callback);
   ...
}

と:

my_func('value1', 'some_other_function');

それから:

$args は ('value', 'some_other_function'); になります。

于 2012-07-17T23:44:31.170 に答える
1

get_func_args を探していると思います: http://php.net/manual/en/function.func-get-args.php

于 2012-07-17T23:39:21.970 に答える
1

をご覧くださいfunc_get_args。次のように、関数に渡されたすべての値の配列を取得するために使用できます。

<?php

$args = func_get_args();
var_export($args);

?>

関数が PHP で受け入れる値の名前を取得することはできません。

この背後にある理由は単純です。入力変数の順序を並べ替えることはありません。これについて考えてください:

function foo($var1, $var2, $var3) {

パラメーター 1 として必要なものを渡します。パラメーター 2 または 3 で$var1必要なものを渡すことはありません。$var1

関数自体の内部で関数パラメーターをログに記録しないのはなぜですか?

function foo($one, $two) {
    echo '$one: '. $one "\n";
    echo '$two: '. $two "\n";
}
于 2012-07-17T23:39:38.293 に答える
1

ファイルから特定の行への最も簡単な方法は、 を使用して読み取ることですが、ファイルfile全体を一度に読み取るため、パフォーマンスのオーバーヘッドが発生する可能性があります。

function func ($arg1, $arg2) 
{
  list($caller) = debug_backtrace (); 
  $file_lines   = file ($caller['file']);

  echo "function called as: " . $file_lines[$caller['line'] - 1]; 
}

$a = $b = 0;

func ($a,$b);

function called as: func ($a,$b);

ただし、実行していることにはいくつかの問題があります。1 つは、呼び出しが行われる場所の内容が 1 行にまたがるだけであると想定する場合です。関数に多くの引数がある場合、以下のスニペットのように複数の行に分割することができます。その場合、関数は本来の動作をしません。

func (
  $a, $b,
  $c, $d
);

関数によって出力されるコンテンツには、);


「常に」機能する本格的な例を含む保留中の編集

于 2012-07-17T23:46:34.247 に答える