Bir değişkenin adını almak için bir yolu var mı?

9 Cevap php

I know this is not exactly reflection, but kind of. I want to make a debug function that gets a variable and prints a var_dump and the variable name.

Programcı işlevine bir çağrı yazdığında Tabii ki, onlar already know değişkenin adı, bu yüzden onlar gibi bir şey yazabilirsiniz:

debug( $myvar, 'myvar' );

Ama, sadece işlev adı, değişken, ve voilà hızlı ve kolay yazmak için olmak istiyorum!

debug( $myvar ); // quicker and easier :)

9 Cevap

Sen işlevine geçirmeden önce ayarlanmış bir anahtar / değer değişkeni dönüştürerek yapabilirsiniz.

function varName($theVar) {  
   $variableName = key($theVar);  
   $variableValue = $theVar[$variableName];  
   echo ('The name of the variable used in the function call was '.$variableName.'<br />');  
   echo ('The value of the variable used in the function call was '.$variableValue.'<br />');  
}
$myVar = 'abc';
varName(compact('myVar'));

Ben isimsiz bir değişken için bir başvuru oluşturarak önermiyoruz rağmen, function varName(&$theVar) da çalışır.

Kompakt beri () kolay olmalıdır değişken isimleri bir liste üzerinde yineleme, bir dize yerine gerçek değişken olarak değişken adını alır.

Bunu yapmak istersiniz neden olarak - Bana sorma ama bir sürü insan bu yüzden burada benim çözüm soru sorabilir gibi görünüyor yok.

Hayır, mümkün değil. Özür dilerim.

function debug($someVar) { }: Ben daha önce aynı düşünce vardı, ama gerçekten bu konuda düşünüyorsanız, bu imkansız neden görürsünüz ... tahminen sizin debug function böyle tanımlanmış olacak ve orijinal değişken $myvar çağrıldı bilmek için hiçbir yolu yoktur.

Yapabileceğin mutlak iyi değeri uygun bir şeyler bulmak için (nedense bir küresel olsaydı) get_defined_vars() veya $_GLOBALS gibi bir şey bakmak ve bu döngü olacaktır değişken. Bu olsa çok hacky ve çok güvenilir değil bir yöntemdir. Orijinal yöntemi en etkili yoludur.

Hayır, yakın alırsınız ile get_defined_vars ().

EDIT: Yanılmışım, get_defined_vars üzerinde kullanıcı yorumlarını okuduktan sonra () biraz kesmek ile mümkün:

function ev($variable){
    foreach($GLOBALS as $key => $value){
        if($variable===$value){
            echo '<p>$'.$key.' - '.$value.'</p>';
        }
    }
}

$lol = 123;

ev($lol); // $lol - 123

Sadece olsa benzersiz değişken içeriği için çalışıyor.

Ben 4 yaşındaki bir soruyu yanıtlarken ama ne halt biliyorum ...

compact() Burada senin arkadaşın yardımcı olabilir!

Ben hızlı bir şekilde hataları ayıklama ve böyle bir şey gider için bir günlüğüne bir kaç seçilmiş değişkenler üzerinde bilgi dökümü için benzer bir işlev yaptı:

function vlog() {
    $args = func_get_args();
    foreach ($args as $arg) {
        global ${$arg};
    }
    return json_encode(compact($args));
}

Ben JSON benim günlükleri bu dökümleri için en temiz ve en okunabilir biçimi bulundu ama aynı zamanda print_r() veya var_export () gibi bir şey kullanabilirsiniz.

Bu onu kullanmak nasıl:

$foo = 'Elvis';
$bar = 42;
$obj = new SomeFancyObject();

log('Something went wrong! vars='.vlog('foo', 'bar', 'obj'));

Ve bu günlükleri için böyle yazdırmak istiyorum:

Bir şeyler yanlış gitti! vars = {"foo": "Elvis", "bar": 42, "obj": {"nestedProperty1": 1, "nestedProperty2": "vb"}}

Ancak uyarı bir kelime:. Bu, yalnızca genel kapsamda (yani içeride değil işlevleri veya sınıflar bildirilen değişkenler için çalışacak orada ise bu kapsam erişimi vardır böylece doğrudan) (kompakt uyandırmak gerekir, ama bu gerçekten bu kadar büyük değil Bu anlaşma vlog beri () Bana ihtiyacınız her zaman 16 tuş vuruşlarını kaydederek, temelde json_encode için sadece bir kısayol (compact ('foo', 'bar', 'obj')) 'dir.

Değil zarif ... BUT YOU COULD FAKE IT!

  • 1)) bir sürü alacağım (bu iyi bir fikir kendinizi ikna için yeterli İçecek
  • 2) değişken değişkenler ile tüm değişkenleri değiştirin:
$a = 10
//becomes
$a = '0a';
$$a = 10;
  • Tüm kod 3) Başvuru $ $ a.
  • 4) Eğer değişken print $ a yazdırmak ve lider 0 dışında şerit gerektiğinde.

Zeyilname: Eğer varsa sadece bunu

  • Bu herkese kodunu gösteren asla
  • Bu kodu değiştirmek ya da korumak gerekir asla
  • Deli misin
  • Bir iş için bu yapmıyorum
  • Sadece bunu asla, bak, bu bir şaka

Biraz geç burada oyuna, ama Mach 13 ilginç bir çözümü var: How to get a variable name as a string in PHP

Sen eval kullanabilirsiniz:

function debug($variablename)
{
  echo ($variablename . ":<br/>");
  eval("global $". $variablename . ";");
  eval("var_dump($" . $variablename . ");");
}

Kullanım: debug("myvar") değildir debug($myvar)

Ben Alix ve nickf bu düşündüren inanıyorum:

function debug($variablename)
{
  echo ($variablename . ":<br/>");
  global $$variablename; // enable scope
  var_dump($$variablename);
}

Ben test ettim ve (Teşekkürler Wagger: Ben bunu yazmak ve küresel değişken bildirge benim engel oldu çok kez denedim) Wagger koduna kadar iyi iş gibi görünüyor