获取传递给PHP函数的变量的名称?

时间:2011-09-05 15:51:11

标签: php debugging

我只是将它们放在一起以帮助调试一些PHP脚本。正如你所看到的,它很草率但我会更多地改进它。

我的调试函数传入了2个变量,一个变量名和一个变量值。

是否可以传入变量并以某种方式获取变量的名称而无需手动执行此操作,就像我现在设置它一样?

功能

<?php
function debug($varname, $var)
{
    echo '<br>' . $varname;

    // $var is a STRING
    if (is_string($var)) {
        echo ' (string) = ' . $var . '<br>';

    // $var is an ARRAY
    } elseif (is_array($var)) {
        echo ' (array) = <pre>';
        print_r($var);
        echo '</pre><br>';

    // $var is an INT
    } elseif (is_int($var)) {
        echo ' (int) = ' . $var . '<br>';

    // $var is an OBJECT
    } elseif (is_object($var)) {
        echo ' (object) = <pre>';
        var_dump($var);
        echo '</pre><br>';
    }
}

测试

$testString = 'just a test!';
$testArray = array(
    'key1' => 'value1',
    'key2' => 'value2',
    'key3' => 'value3'
    );
$testInt = 1234567890;

$testObject = new stdClass;
$testObject->someVar1 = 'testing123';
$testObject->someVar2 = '321gnitset';

debug('$testString', $testString);
debug('$testArray', $testArray);
debug('$testInt', $testInt);
debug('$testObject', $testObject);
?>

结果......

$testString (string) = just a test!

$testArray (array) = 
Array
(
    [key1] => value1
    [key2] => value2
    [key3] => value3
)



$testInt (int) = 1234567890

$testObject (object) = 
object(stdClass)#1 (2) {
  ["someVar1"]=>
  string(10) "testing123"
  ["someVar2"]=>
  string(10) "321gnitset"
}

6 个答案:

答案 0 :(得分:2)

如果你想知道名字,为什么不直接传递变量名称的字符串常量,并使用全局数组来访问它(对于程序程序)

function foo($var) {
    echo $var; //name of the variable
    echo $GLOBALS[$$var]; //value of the variale
}

$bar = 'a string';
foo('bar');

答案 1 :(得分:1)

查看此php函数func_get_arg()

实际上......看起来你真的不能这样做......检查另一个问题How to get a variable name as a string in PHP?

答案 2 :(得分:0)

debug_print_backtrace()是你的朋友!将其添加到您的debug()功能。

如果您仍然只需要调用函数名称,则可以使用debug_backtrace()并在返回的数组中搜索上一个函数的名称,在关联数组结果中标识为“function”!

答案 3 :(得分:0)

我将这些函数放在一起用于我自己的调试,只需复制并将其保存在单独的文件中,包含它并使用函数d()来调用花哨的调试打印。它假设根据传递的变量类型对结果进行颜色编码。

if(!defined('m_debug')) {define('m_debug', 1);}
function d($var) {
    if (m_debug) {

        $bt = debug_backtrace();
        $src = file($bt[0]["file"]);
        $line = $src[ $bt[0]['line'] - 1 ];

        //striping the inspect() from the sting
        $strip = explode('d(', $line);
        $matches = preg_match('#\(#', $strip[0]);
        $strip = explode(')', $strip[1]);
        for ($i=0;$i<count($matches-1);$i++) {
            array_pop($strip);
        }
        $label = implode(')', $strip);

           d_format($var, $label);
    }

}

function l() {
    global $super_dump_log;

    if (func_num_args() > 0) {
        $array = func_get_args();
        array_merge($super_dump_log, $array);
    } else {
        foreach($super_dump_log as $log){
            //
        }
    }
}

function d_format($var, $label) {

    $colorVar = 'Blue';
    $type = get_type($var);
    $colorType = get_type_color($type);

    echo "<div class='m_inspect' style='background-color:#FFF; overflow:visible;'><pre><span style='color:$colorVar'>";
    echo $label;
    echo "</span> = <span class='subDump' style='color:$colorType'>";
    if ($type == 'string') {
        print_r(htmlspecialchars($var));
    } else {
        print_r($var);
    }
    echo "</span></pre></div>";
}

function get_type($var) {

    if (is_bool($var)) {
        $type = 'bool';
    } elseif (is_string($var)) {
        $type = 'string';
    } elseif (is_array($var)) { 
        $type = 'array';        
    } elseif (is_object($var)) {    
        $type = 'object';       
    } elseif (is_numeric($var)) {
        $type = 'numeric';
    } else {
        $type = 'unknown';
    }

    return $type;
}


function get_type_color($type) {

    if ('bool' == $type) {
        $colorType = 'Green';
    } elseif ('string' == $type) {
        $colorType = 'DimGrey';
    } elseif ('array' == $type) {
        $colorType = 'DarkOrchid';
    } elseif ('object' == $type) {
        $colorType = 'BlueViolet';
    } elseif ('numeric' == $type) {
        $colorType = 'Red'; 
    } else {    
        $colorType = 'Tomato';  
    }

    return $colorType;
}

答案 4 :(得分:0)

您可以从另一端执行此操作。在字符串变量中传递变量名称,然后用$$调用它以传递实际变量。我做了my_var_dump函数:

function my_var_dump($varName, $var, $line = false, $func = false)
{
    if ($func) $func = ' in function ' . $func;
    if ($line) $line = ' at line ' . $line;
    echo '<pre>DEBUG $' . $varName . $line . $func . PHP_EOL;
    var_dump($var);
    echo '</pre>' . PHP_EOL;
}

像这样调用此函数:

my_var_dump($varName = "some_var_name", $$varName, __LINE__, __FUNCTION__);

答案 5 :(得分:-2)

解决方案:

  

$ argv - 传递给脚本

的参数数组

示例:

<?php
var_dump($argv);
?>

参考: PHP's $argv documentation