Variable Variablen, die auf Arrays oder verschachtelte Objekte zeigen
-
19-09-2019 - |
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?
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);