PHP, nasıl bir dize içine bir Argüman Adı dönüştürme

8 Cevap php

Amacım bir işleve geçirilen argüman yankı etmektir. Örneğin, bu nasıl yapılabilir?

$contact_name = 'foo';

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

do_something($contact_name);

8 Cevap

Sen yapamazsın. Bunu yapmak istiyorsanız, siz de örneğin adları geçmesi gerekir:

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

Düz PHP.net variables sayfa off:

<?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;
  }
?>

To track Variable name You can throw and catch Exception. In penultimate line of trace is information about this function name and name of variables.

Örnek nasıl bu kullanın: http://blog.heintze.pl/2012/01/12/lepszy-var_dump-czyli-przyjemniejsze-debugowanie-php/ daha var dökümü oluşturmak için (kod Link: http://blog.heintze.pl/wp-content/uploads/2012/01/bigWeb.zip)

Ne yazık ki - bu makalede, bu anda sadece cilası bulunmaktadır.

Değişkenler sadece bellekte değerleri veya alanları ele anlamına vardır. Sen değer bir işleve geçti bulunuyor değişken adı alınamıyor.

Disclaimer: this will oonly work if you pass a variable to the function, not a value, and it only works when your not in a function or a class. So only the GLOBAL scope works :)

Good funct($var)
Bad funct(1)

Bunu popüler aslında aykırı ^ _ ^ inanıyorum yapabilirsiniz. ama $ GLOBALS değişkeni ile bir kaç arama hile içerir.

Bunu gibi bunu:

$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;
      }
   }
}

this method is not fool proof tho. Because if two variables have the same value, the function will get the name of the first one it finds. Not the one you want :P Its best to make the variable value unique before hand if you want accuracy on variable names

Başka bir yöntem şöyle doğru olması için referans kullanmak olacaktır

$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;
      }
   }
}

yani bu tamamen mümkündür :)

I bir daha okunabilir geldi PTBNL en (en kesinlikle doğru) cevap dayalı yaklaşım (en azından ben öyle düşünüyorum):

/**
 * 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;

Sander doğru cevabı vardır, ama burada ben arıyordum tam bir şey:

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

Mümkün değil.