1

我试图找出传递给函数的参数的名称。

为此,我使用 debug_backtrace() 来获取调用该函数的文件和行。

然后打开文件,逐行读取,直到出现我要查找的行。

$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

这是一个复杂的问题。即使在您的示例中,函数的第二个参数也没有名称,因为它是调用另一个函数的返回值。

您可能会幸运地使用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
        )

)

使用解析器标记列表,您可以遍历该数组并找出传递给函数的参数是什么。即便如此,它也可能过于笼统,因为您的调用my_function只是T_STRINGZend 引擎最终在函数表中查找并调用该函数(如果它存在),或者如果它不存在则抛出一个致命错误的一个标记。

于 2012-07-17T23:43:44.603 回答
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) {

你将你想要的东西$var1作为参数 1 传递。你永远不会$var1在参数 2 或 3 中传递你想要的东西。

为什么不将函数参数记录在函数本身中?

function foo($one, $two) {
    echo '$one: '. $one "\n";
    echo '$two: '. $two "\n";
}
于 2012-07-17T23:39:38.293 回答
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

从文件中读取特定行的最简单方法是使用 读取它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);

但是,做你正在做的事情有一些问题,因为你假设调用发生的地方的内容只跨越一行。如果您对函数有很多参数,则可以将其拆分为几行,如下面的代码片段所示,在这种情况下,您的函数将无法正常运行。

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

您的函数打印的内容将仅包含);


待编辑的完整示例将“始终”工作

于 2012-07-17T23:46:34.247 回答