Bir çağrı değişkenin adını bulun

10 Cevap

Bu PHP ile mümkünse eğer herkes bir fikri vardır?

function foo($var) {
    // the code here should output the value of the variable
    // and the name the variable has when calling this function
}

$hello = "World";
foo($hello);

Bana bu çıktıyı verir misin

varName = $hello
varValue = World

EDIT

Burada çoğu insan beri biz bu davranış arıyoruz neden biraz daha ayrıntılı gidiyorum kötü uygulamalara ve global değişkenler şeyler bana 'itham'.

Biz de bu tür davranışlarda arıyoruz nedeni daha kolay bizim İzlenme değişkenleri atama yapmak istiyor.

Bizim görünümünde değişkenleri atamak için yapıyoruz çoğu zaman

$this->view->assign('products', $products);
$this->view->assign('members', $members);

Sadece aşağıdakileri yapın ve görünümü atanan veri bizim görüşlerimizin alır değişken adını belirlenmesinde sorumlu izin edebilmek için daha kolay ve daha okunabilir olurdu da.

$this->view->assign($products);
$this->view->assign($members);

10 Cevap

Ne olursa olsun bu bile mümkün olduğunu benim şüphe, onun değişkenleri isim nasıl bir programcı zorlayan genellikle kötü bir fikir olduğunu düşünüyorum. Gibi soruları cevaplamak zorunda olacak

Neden değişkeni $arrProducts yerine $products in isim değil mi?

Eğer ortaya bir işlevin dönüş değeri koymak istiyorsanız da ciddi bir sıkıntı içine almak istiyorsunuz. (Herhangi bir nedenle) kategorisinde küçük olması için ihtiyacı olan aşağıdaki kodu düşünün:

$this->view->assign(strtolower($category)); 

Bu planlıyorsanız ne işe yaramaz.

Benim cevabım bu nedenle: Stick to the 'verbose' way you're working, it is a lot easier to read and maintain.

Bunu yaşamak yapamıyorsanız, yine görünümüne bir magic function ekleyebilirsiniz:

public function __set($name, $value) {
    $this->assign($name, $value);
}

Sonra yazabilirsiniz

$this->view->product = $product;

Ben bu mümkün any dil olduğunu sanmıyorum. Bu değişkenler nasıl basitçe değil. Bir değişkenin ve bu tutar değer arasında bir fark yoktur. İşlevin içindeki foo, sen değere sahip, ancak değerini düzenlenen değişken mevcut değildir. Bunun yerine, yeni bir değişkeni $var bu değeri tutmak zorunda.

Bir değişken üzerinde bir adla bir kova gibidir: Bu gibi bakmak. Değişkenin içeriği (değeri) kovanın içinde ne olduğunu. Bir işlevini çağırdığınızda, kendi kova (parametre adları) ile gelir ve (değeri dışında kopyalanan ve hala kullanılabilir olduğu için de, metafor burada bozulduğu), bu içine kepçenin içeriğini dökün. Fonksiyonu içinde, içeriğini saklamak için kullanılan kova hakkında bilmek için hiçbir yolu yoktur.

Ne soruyorsun mümkün değildir. Öyle bile olsa, büyük olasılıkla kolayca istismar alabilir şey onun tür olarak kötü bir uygulama düşünülebilir.

Eğer böyle bir şey başarmak için kararlı iseniz, alabileceğiniz en yakın bir dizge olarak değişken adı geçmesi ve $ GLOBALS diziden fonksiyonu başvurmak olacaktır.

örneğin

function this_aint_a_good_idea_really($var) {
    print "Variable name: {$var}\n";
    print "Variable contents: {$GLOBALS[$var]}\n";
}
$hello="World";
this_aint_a_good_idea_really('hello');

Ama dediğim gibi, bu gerçekten iyi bir fikir değildir, ne de çok yararlıdır. (Açıkçası, global değişkenler kullanarak çare, hemen her zaman, muhtemelen yanlış bir şey yapıyoruz)

Bir işlev debug_backtrace çağrılan nerede imkansız değil, size (), daha sonra (ne arama satırı ("merhaba $ kullanıcı,". $ Dolaylı ($ kullanıcı foo ise parametre ifadeleri ayıklamak için çalışan yazısının bir kopyasını tokenize bulabilirsiniz , 5))?)

onun yanlış nedenini - Bunu başarmak için çalışıyoruz için sahip Ancak sebebi ne olursa olsun.

C.

Tamam, bazı çirkin kesmek, ama bu şimdiye kadar var ne için zaman, ben biraz daha sonra üzerinde çalışmak için çalışacağım

<?php
class foo
{
    //Public so we can test it later
    public $bar;
    function foo()
    {
        //Init the array
        $this->bar = array();
    }
    function assign($__baz)
    {
        //Try to figure out the context
        $context = debug_backtrace();
        //assign the local array with the name and the value
        //Alternately you can initialize the variable localy
        //using $$__baz = $context[1]['object']->$__baz;
        $this->bar[$__baz] = $context[1]['object']->$__baz;
    }
}
//We need to have a calling context of a class in order for this to work
class a
{
    function a()
    {

    }
    function foobar()
    {
        $s = "testing";
        $w = new foo();
        //Reassign local variables to the class
        foreach(get_defined_vars() as $name => $val)
        {
            $this->$name = $val;
        }
        //Assign the variable
        $w->assign('s');
        //test it
        echo $w->bar['s'];
    }
}
//Testrun
$a = new a();
$a->foobar();

imkansız - max. Alacağınız bilgi kestirmeniz damping gördüğünüz ne

debug_backtrace();

Belki ne yapmak istediğiniz etrafında başka bir yol, böyle bir hackish çözüm çalışıyor:

<?php
  function assign($val)
  {
    global $$val;
    echo $$val;
  }
  $hello = "Some value";
  assign('hello');

Çıkışlardan: Some value

Eğer yapmak istediğiniz ne, PHP için niyetinde değildir. Bunu gerçekleştirmek için hiçbir geleneksel yolu yoktur. Aslında, sadece oldukça abartılı çözümler mevcuttur. Aklıma gibi PHP gibi yakın kalır biri yeni bir sınıf yaratıyor.

Sen NamedVariable onu aramak, ya da bir şey, ve onun kurucusuna gibi değişken adını ve değerini alır olabilir. Sen $products = new NamedVariable('products', $productData); ardından $this->view->assign($products); olarak kullanmak gibi başlatmak istiyorum. Kod tabanı içine sınıf ve şimdi atama yöntemi NamedVariable değişken adını hem ayıklamak hakkında bilmek vardır - ve oldukça belirsiz - Tabii ki, deklarasyon satırı artık başka içeren konum, oldukça uzun ve değer.

Diğer üyelerin çoğu yanıtladı var gibi, sözdizimsel şeker bu hafif eksikliği ile acı daha kapalı. Sen, başka bir yaklaşım atamak örneklerini tanır () 'ler ve kaynak kodu yeniden yazar bir komut dosyası oluşturmak olacaktır. Eğer olsa, ve aptalca PHP için, kodunuzu koştu önce bu şimdi bazı ekstra adımı içerecektir. Hatta otomatik olarak atanması () 's doldurmak için yapılandırmak IDE olabilir. Neyi seçerseniz seçin, PHP doğal hiçbir çözüm niyetinde.

Bu çözüm GLOBALS değişkeni kullanır. Kapsam sorunları çözmek için, değişken referans olarak geçti ve değeri benzersiz olmak için modifiye edilir.

function get_var_name(&$var, $scope=FALSE) {
    if($scope) $vals = $scope;
    else      $vals = $GLOBALS;
    $old = $var;
    $var = $new = 'unique'.rand().'value';
    $vname = FALSE;
    foreach ($vals as $key => $val) {
        if($val === $new) $vname = $key;
    }
    $var = $old;
    return $vname;
}

$testvar = "name";
echo get_var_name($testvar);  // "testvar"

function testfunction() {
    $var_in_function = "variable value";
    return get_var_name($var_in_function, get_defined_vars());
}

echo testfunction();  // "var_in_function"

class testclass {
    public $testproperty;
    public function __constructor() {
        $this->testproperty = "property value";
    }
}

$testobj = new testclass();
echo get_var_name($testobj->testproperty, $testobj);  // "testproperty"