Diziler işaret Değişken Değişkenler veya İçiçe Nesneler

4 Cevap php

Bir dizi ya da iç içe nesnelerin değişken değişken işaret oluşturmak mümkün mü? Php dokümanlar özellikle size superglobal'leri işaret edemez söylüyorlar ama onun belirsiz (en azından benim için) bu genel olarak diziler için geçerli olup olmadığını.

İşte dizi var var benim bir deneyin.

     // Array Example
     $arrayTest = array('value0', 'value1');
     ${arrayVarTest} = 'arrayTest[1]';
     // This returns the correct 'value1'
     echo $arrayTest[1];
     // This returns null
     echo ${$arrayVarTest};   

Burada nesne var var demek ne göstermek için bazı basit bir koddur.

     ${OBJVarVar} = 'classObj->obj'; 
     // This should return the values of $classObj->obj but it will return null  
     var_dump(${$OBJVarVar});    

Burada belirgin bir şey eksik?

4 Cevap

Array element approach:

  • Dizeden dizi adı ayıklayın ve $arrayName depolamak.
  • Dizeden dizi indeksi ayıklayın ve $arrayIndex depolamak.
  • Doğru yerine bir bütün olarak onları ayrıştırmak.

Kodu:

$arrayTest  = array('value0', 'value1');
$variableArrayElement = 'arrayTest[1]';
$arrayName  = substr($variableArrayElement,0,strpos($variableArrayElement,'['));
$arrayIndex = preg_replace('/[^\d\s]/', '',$variableArrayElement);

// This returns the correct 'value1'
echo ${$arrayName}[$arrayIndex];

Object properties approach:

  • (->) Onun sınırlayıcıyla erişmek istediğiniz sınıf ve özellik içeren dize patlayabilir.
  • $class için bu iki değişken atamak ve $property.
  • Bunun yerine, var_dump() üzerine bir bütün olarak ayrı ayrı onları ayrıştırmak

Kodu:

$variableObjectProperty = "classObj->obj";
list($class,$property)  = explode("->",$variableObjectProperty);

// This now return the values of $classObj->obj
var_dump(${$class}->{$property});    

İşe yarıyor!

In echo $arrayTest[1]; vars isim değil $arrayTest[1] $arrayTest 1 bir dizi indeksi ile ve. Parantez PHP "anahtar kelimeler" vardır. Yöntemi notasyonu ve -> operatörü ile aynı. Yani bölmek gerekir.

// bla[1]
$arr = 'bla';
$idx = 1;
echo $arr[$idx];

// foo->bar
$obj = 'foo';
$method = 'bar';
echo $obj->$method;

Ne yapmak istediğinizi daha PHP kodunu değerlendirmek gibi geliyor (eval()). Ama unutmayın: eval kötülüktür. ;-)

Hayır bunu yapamam. Sadece değişken, nesne ve fonksiyon isimleri ile yapabilirsiniz.

Örnek:

 $objvar = 'classObj';
 var_dump(${$OBJVarVar}->var);

Alternatifler eval () üzerinden veya ön-işleme yaparak olabilir.

$arrayTest = array('value0', 'value1');
$arrayVarTest = 'arrayTest[1]';

echo eval('return $'.$arrayVarTest.';');
eval('echo $'.$arrayVarTest.';');

Eğer giriş olacak ne çok emin iseniz budur.

Ön-işleme ile:

function varvar($str){
  if(strpos($str,'->') !== false){
    $parts = explode('->',$str);
    global ${$parts[0]};
    return $parts[0]->$parts[1];
  }elseif(strpos($str,'[') !== false && strpos($str,']') !== false){
    $parts = explode('[',$str);
    global ${$parts[0]};
    $parts[1] = substr($parts[1],0,strlen($parts[1])-1);
    return ${$parts[0]}[$parts[1]];
  }else{
    return false;
  }
}

$arrayTest = array('value0', 'value1');
$test = 'arrayTest[1]';
echo varvar($test);

= & referans olarak atamak için kullanın:

 $arrayTest = array('value0', 'value1');
 $arrayVarTest = &$arrayTest[1];

 $arrayTest[1] = 'newvalue1'; // to test if it's really passed by reference

 print $arrayVarTest;