我试图找出传递给函数的参数名称。
为此,我使用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)');
答案 0 :(得分: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
)
)
使用List of Parser Tokens,您可以循环遍历该数组,并找出传递给该函数的参数。即便如此,它可能过于通用,因为您对my_function
的调用只是一个T_STRING
令牌,Zend引擎最终在函数表中查找并调用该函数(如果存在),或者抛出致命错误如果没有。
答案 1 :(得分:1)
我认为你正在寻找get_func_args:http://php.net/manual/en/function.func-get-args.php
答案 2 :(得分:1)
看看func_get_args
。您可以使用它来获取传递给函数的所有值的数组,如下所示:
<?php
$args = func_get_args();
var_export($args);
?>
你无法检索函数在PHP中接受的值的名称。
这背后的原因很简单,你永远不会重新排列输入变量的顺序。想一想:
function foo($var1, $var2, $var3) {
您将$var1
所需的内容作为参数1传入。您将永远不会在参数2或3中传递$var1
所需的内容。
为什么不在函数本身内记录函数参数?
function foo($one, $two) {
echo '$one: '. $one "\n";
echo '$two: '. $two "\n";
}
答案 3 :(得分: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');
答案 4 :(得分: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
);
您的函数打印的内容仅包含);
等待编辑,使用一个完整的示例“始终”工作