В PHP, Как преобразовать имя аргумента в строку - PullRequest
1 голос
/ 29 мая 2009

Моя цель - повторить аргумент, переданный функции. Например, как это можно сделать?

$contact_name = 'foo';

function do_something($some_argument){
// echo 'contact_name'  .... How???
}

do_something($contact_name);

Ответы [ 9 ]

4 голосов
/ 29 мая 2009

Вы не можете. Если вы хотите это сделать, вам также необходимо указать имена, например:

$contact_name = 'foo';
$contact_phone = '555-1234';

function do_something($args = array()) {
    foreach ($args as $name => $value) {
        echo "$name: $value<br />";
    }
}

do_something(compact('contact_name', 'contact_phone'));
1 голос
/ 13 января 2012

Для отслеживания имени переменной Вы можете бросить и поймать исключение. В предпоследней строке трассировки находится информация об имени этой функции и названии переменных.

Пример использования этого: http://blog.heintze.pl/2012/01/12/lepszy-var_dump-czyli-przyjemniejsze-debugowanie-php/ для создания лучшего дампа var (Ссылка на код: http://blog.heintze.pl/wp-content/uploads/2012/01/bigWeb.zip)

К сожалению, в настоящее время эта статья только на польском языке.

1 голос
/ 29 мая 2009

Прямо с PHP.net переменные страница:

<?php
  function vname(&$var, $scope=false, $prefix='unique', $suffix='value')
  {
    if($scope) $vals = $scope;
    else $vals = $GLOBALS;
    $old = $var;
    $var = $new = $prefix.rand().$suffix;
    $vname = FALSE;
    foreach($vals as $key => $val) {
      if($val === $new) $vname = $key;
    }
    $var = $old;
    return $vname;
  }
?>
0 голосов
/ 01 июня 2009

Сандер имеет правильный ответ, но вот именно то, что я искал:

$contact_name = 'foo';

function do_something($args = array(), $another_arg) {
    foreach ($args as $name => $value) {
        echo $name;
        echo '<br>'.$another_arg;
    }
}

do_something(compact(contact_name),'bar');
0 голосов
/ 29 мая 2009

Основываясь на ответе PTBNL (наиболее точно правильном), я придумал более читабельный (по крайней мере, мне так кажется) подход:

/**
 * returns the name of the variable posted as the first parameter.
 * If not called from global scope, pass in get_defined_vars() as the second parameter
 *
 * behind the scenes:
 *
 *   this function only works because we are passing the first argument by reference.
 *   1. we store the old value in a known variable
 *   2. we overwrite the argument with a known randomized hash value
 *   3. we loop through the scope's symbol table until we find the known value
 *   4. we restore the arguments original value and
 *   5. we return the name of the symbol we found in the table
 */
function variable_name( & $var, array $scope = null )
{
    if ( $scope == null )
    {
        $scope = $GLOBALS;
    }

    $__variable_name_original_value = $var;
    $__variable_name_temporary_value = md5( number_format( microtime( true ), 10, '', '' ).rand() );
    $var = $__variable_name_temporary_value;

    foreach( $scope as $variable => $value )
    {
        if ( $value == $__variable_name_temporary_value && $variable != '__variable_name_original_value' )
        {
            $var = $__variable_name_original_value;
            return $variable;
        }
    }
    return null;
}

// prove that it works:

$test = 1;
$hello = 1;
$world = 2;
$foo = 100;
$bar = 10;
$awesome = 1;

function test_from_local_scope()
{
    $local_test = 1;
    $local_hello = 1;
    $local_world = 2;
    $local_foo = 100;
    $local_bar = 10;
    $local_awesome = 1;

    return variable_name( $local_awesome, get_defined_vars() );
}
printf( "%s\n", variable_name( $awesome, get_defined_vars() ) ); // will echo 'awesome'
printf( "%s\n", test_from_local_scope() ); // will also echo awesome;
0 голосов
/ 29 мая 2009
class Someone{
  protected $name='';
  public function __construct($name){
    $this->name=$name;
  }

  public function doSomthing($arg){
     echo "My name is: {$this->name} and I do {$arg}";
  }
}

//in main
$Me=new Someone('Itay Moav');
$Me->doSomething('test');
0 голосов
/ 29 мая 2009

Отказ от ответственности: это будет работать только в том случае, если вы передаете в функцию переменную, а не значение, и работает только тогда, когда вы не в функции или классе. Так что работает только ГЛОБАЛЬНАЯ сфера:)

Good funct($var)
Bad funct(1)

Вы можете сделать это на самом деле вопреки распространенному мнению ^ _ ^. но он включает в себя несколько приемов поиска с переменной $ GLOBALS.

вы делаете это так:

$variable_name = "some value, better if its unique";

function funct($var) {
   foreach ($GLOBALS as $name => $value) {
      if ($value == $var) {
         echo $name; // will echo variable_name
         break;
      }
   }
}

этот метод не является надежным. Потому что, если две переменные имеют одинаковое значение, функция получит имя первой найденной переменной. Не тот, который вы хотите: P Лучше всего сделать значение переменной уникальным, если вы хотите точность имен переменных

Другим методом будет использование ссылки, чтобы быть точным, как это

$variable_name = 123;

function funct(&$var) {

   $old = $var;
   $var = $checksum = md5(time());  // give it unique value

   foreach ($GLOBALS as $name => $value) {
      if ($value == $var) {
         echo $name; // will echo variable_name
         $var = $old; // reassign old value
         break;
      }
   }
}

так что вполне возможно:)

0 голосов
/ 29 мая 2009

Переменные - это просто средство для адресации значений или областей в памяти. Вы не можете получить имя переменной, значение которой было передано функции.

0 голосов
/ 29 мая 2009

Не возможно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...