Php 找出传递给函数的参数

Php 找出传递给函数的参数,php,debugging,Php,Debugging,我试图找出传递给函数的参数的名称 为此,我使用debug_backtrace()获取调用函数的文件和行 然后打开文件,逐行阅读,直到我要查找的行出现 $file = fopen($caller['file'], 'r' ); $line = 0; while(($row = fgets($file)) !== false){ $line++; if($line == $caller['line']) break; } fclose($file); // $row is

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

为此,我使用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_函数($var1,some_other_函数($othervar1,$othervar2))

如何从中提取参数?我想得到一个数组,如:

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

我想你在找get_func_args:

我想你在找get_func_args:

看看
func_get_args
。您可以使用它获取传递给函数的所有值的数组,如下所示:

<?php

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

?>
您将所需的
$var1
作为参数1传入。您永远不会在参数2或3中传递所需的
$var1

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

function foo($one, $two) {
    echo '$one: '. $one "\n";
    echo '$two: '. $two "\n";
}

查看
func\u get\u args
。您可以使用它获取传递给函数的所有值的数组,如下所示:

<?php

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

?>
您将所需的
$var1
作为参数1传入。您永远不会在参数2或3中传递所需的
$var1

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

function foo($one, $two) {
    echo '$one: '. $one "\n";
    echo '$two: '. $two "\n";
}

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

您可能有幸为自己标记代码,然后可以循环结果并尝试获得所需的内容

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

print_r($tokens);
$tokens=token\u get\u all(“”);
打印(代币);
收益率:

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
        )

)
数组
(
[0]=>阵列
(
[0] => 372
[1] => 
[2] => 1
)
)

使用,您可以在该数组上循环,并找出传递给函数的参数是什么。即便如此,它也可能过于通用,因为对
my_函数的调用只是一个
T_字符串
标记,Zend引擎最终会在函数表中查找该标记,并在该函数存在时调用该函数,否则会抛出致命错误。

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

您可能有幸为自己标记代码,然后可以循环结果并尝试获得所需的内容

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

print_r($tokens);
$tokens=token\u get\u all(“”);
打印(代币);
收益率:

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
        )

)
数组
(
[0]=>阵列
(
[0] => 372
[1] => 
[2] => 1
)
)
使用,您可以在该数组上循环,并找出传递给函数的参数是什么。即使如此,它也可能过于通用,因为对
my\u函数的调用只是一个
T\u字符串
标记,Zend引擎最终会在函数表中查找该标记,并在该函数存在时调用该函数,否则会抛出致命错误。

您可以执行以下操作:

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

然后:

$args将是('value','some_other_function')

您可以执行以下操作:

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

然后:


$args将是('value','some_other_function')

从文件中读取特定行的最简单方法是使用
文件
读取该行,但这可能会导致一些性能开销,因为它会一次读取整个文件:

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);


但是,在执行您正在执行的操作时存在一些问题,其中一个问题是您假设调用发生的位置的内容仅跨越一行。如果一个函数有很多参数,您可能会像下面的代码片段那样将其拆分成几行,在这种情况下,您的函数将无法正常工作

func (
  $a, $b,
  $c, $d
);
函数打印的内容将只包含



使用“始终”工作的完整示例进行挂起编辑从文件中读取特定行的最简单方法是使用
文件
,尽管这可能会导致一些性能开销,因为它会一次读取整个文件:

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);


但是,在执行您正在执行的操作时存在一些问题,其中一个问题是您假设调用发生的位置的内容仅跨越一行。如果一个函数有很多参数,您可能会像下面的代码片段那样将其拆分成几行,在这种情况下,您的函数将无法正常工作

func (
  $a, $b,
  $c, $d
);
函数打印的内容将只包含



使用一个全面的示例进行挂起编辑,该示例将“始终”起作用

在定义函数时定义名称。出于好奇,您为什么需要这些名称?您无法通过PHP获取函数接受的变量的名称。函数的参数永远不会更改。我想你要做的是在函数中打印变量本身,看看它们是否被正确传递。不,我只是想编写一个好的调试函数,我还想打印有关源的信息,你在定义函数时定义名称。出于好奇,您为什么需要这些名称?您无法通过PHP获取函数接受的变量的名称。函数的参数永远不会更改。我想你要做的是在函数中打印变量本身,看看它们是否被正确传递。不,我只是想编写一个很好的调试函数,如果你在参数上调用其他函数,我还想打印有关源的信息,您无法检索函数名如果您对参数调用其他函数,则无法检索函数名关于多行的事情您是对的。我想我可以读所有的行,直到我的行出现,然后从上次出现的
my\u function
name开始执行substr(),直到结束。这应该解决这个问题:P@Alex虽然不是真的,这是一个想法,但它不会是