Como obter o nome de uma variável no PHP

image_pdfimage_print

Em situações raras, será necessário obter o nome da variável PHP como uma string.

O pequeno exemplo abaixo ilustra algo que não é possível ainda nativamente no PHP:

$minha_var = 1;
echo var_name ($minha_var); //Deveria imprimir "minha_var"

Muitos indicam que não é possível obter esta informação. No entanto, tendo a informação do nome da variável como string é possível utilizar a variável, como no exemplo abaixo:

$iVarNome = 'MaxSize';
$$iVarNome = 10;
echo $MaxSize; // Imprimirá 10

Como vimos, nativamente o PHP não inclui a facilidade contrária, de com a variável, obter seu nome em string. No entanto, podemos obter esta funcionalidade com o código abaixo:

function var_name (&$var, &$aDefinedVars){
    foreach ($aDefinedVars as $k=>$v)
        $aDefinedVars_0[$k] = $v;

    $iVarSave = $var;
    $var     =!$var;

    $aDiffKeys = array_keys (array_diff_assoc ($aDefinedVars_0, $aDefinedVars));
    $var      = $iVarSave;

    return $aDiffKeys[0];
}

Como esta função deve ser utilizada:
O primeiro parâmetro deve ser a variável que se deseja obter o nome. O segundo parâmetro sempre deve ser o resultado da função get_defined_vars(), que contém um array com todas as variáveis definidas.

A função var_name funciona comparando o resultado do segundo parâmetro antes e depois de modificar os valores das variáveis em busca da que queremos encontrar. Este valor inicial definido é armazenado para posterior comparação, antes de modificar o valor da variável. Após efetuar esta alteração, é efetuado a busca pelo que modificou como forma de identificar o nome da variável em si.

E no final, o valor original da variável é restaurado ao original como forma de não alterar o comportamento final do programa em que a função var_name é utilizado.

Esperamos que esta dica ajudem aqueles raros que precisem desta funcionalidade ainda não nativa. Ela poderá ser utilizada em outros contextos, bastando observar que o segundo parâmetro é quem define a abrangência de onde buscar.

Gostou? Tire um minutinho e dê sua contribuição para Drall Dev Community no Patreon!