Frage

Ist es möglich, eine variable Variable zu erstellen, die auf ein Array oder verschachtelte Objekte zeigt? Die PHP -Dokumente sagen ausdrücklich, dass Sie nicht auf Superglobale hinweisen können, aber es ist unklar (zumindest für mich), wenn dies für Arrays im Allgemeinen gilt.

Hier ist mein Versuch am Array var.

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

Hier ist ein einfacher Code, um anzuzeigen, was ich unter Object var var meine.

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

Vermisse ich hier etwas Offensichtliches?

War es hilfreich?

Lösung

Array -Elementansatz:

  • Extrahieren Sie den Array -Namen aus der Zeichenfolge und speichern Sie ihn in $arrayName.
  • Extrahieren Sie den Array -Index aus der Zeichenfolge und speichern Sie ihn in $arrayIndex.
  • Analysieren Sie sie richtig anstatt als Ganzes.

Der Code:

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

Ansatz des Objekteigenschaften:

  • Explodieren Sie die Zeichenfolge, die die Klasse und Eigenschaft enthält, auf die Sie zugreifen möchten, mit dem Trennzeichen (->).
  • Weisen Sie diese beiden Variablen zu $class und $property.
  • Analysieren Sie sie getrennt anstatt als Ganzes var_dump()

Der Code:

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

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

Es klappt!

Andere Tipps

Verwenden = & Durch Referenz zuweisen:

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

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

 print $arrayVarTest;

Im echo $arrayTest[1]; Der Var -Name ist $arrayTest mit einem Array -Index von 1, und nicht $arrayTest[1]. Die Klammern sind Php "Schlüsselwörter". Gleiches gilt für die Methode Notation und die -> Operator. Sie müssen sich also trennen.

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

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

Was Sie tun möchten, klingt eher nach Bewertung von PHP -Code (eval()). Aber denken Sie daran: Eval ist böse. ;-)

Nein, das kannst du nicht. Sie können dies nur mit Variablen, Objekt- und Funktionsnamen tun.

Beispiel:

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

Alternativen können über Eval () oder durch Vorverarbeitung erfolgen.

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

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

Wenn Sie sich sehr sicher sind, was der Eingang sein wird.

Durch Vorverarbeitung:

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);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top