Переменные переменные, указывающие на массивы или вложенные объекты

Можно ли создать переменную переменную, указывающую на массив или на вложенные объекты? В php docs указано, что вы не можете указывать на SuperGlobals, но неясно (по крайней мере, мне), если это относится к массивам в целом.

Вот моя попытка массива var var.

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

Вот какой простой код, чтобы показать, что я имею в виду под объектом var var.

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

Я пропустил что-то очевидное здесь?

Solutions Collecting From Web of "Переменные переменные, указывающие на массивы или вложенные объекты"

Элемент массива :

  • Извлеките имя массива из строки и сохраните его в $arrayName .
  • Извлеките индекс массива из строки и сохраните его в $arrayIndex .
  • Разбирайте их правильно, а не в целом.

Код:

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

Метод свойств объекта :

  • Разверните строку, содержащую класс и свойство, к которым вы хотите получить доступ, с помощью разделителя (->).
  • Назначьте эти две переменные $class и $property .
  • Разбирайте их отдельно, а не как целое на var_dump()

Код:

 $variableObjectProperty = "classObj->obj"; list($class,$property) = explode("->",$variableObjectProperty); // This now return the values of $classObj->obj var_dump(${$class}->{$property}); 

Оно работает!

Использовать = & для назначения по ссылке:

  $arrayTest = array('value0', 'value1'); $arrayVarTest = &$arrayTest[1]; $arrayTest[1] = 'newvalue1'; // to test if it's really passed by reference print $arrayVarTest; 

В echo $arrayTest[1]; имя vars – $arrayTest с индексом массива 1 , а не $arrayTest[1] . Скобки – это ключевые слова PHP. То же, что и для обозначения метода и оператора -> . Поэтому вам нужно разделиться.

 // bla[1] $arr = 'bla'; $idx = 1; echo $arr[$idx]; // foo->bar $obj = 'foo'; $method = 'bar'; echo $obj->$method; 

То, что вы хотите сделать, больше похоже на оценку кода PHP ( eval() ). Но помните: eval – это зло. 😉

Нет, вы не можете этого сделать. Вы можете делать это только с именами переменных, объектов и функций.

Пример:

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

Альтернативы могут быть через eval () или путем предварительной обработки.

 $arrayTest = array('value0', 'value1'); $arrayVarTest = 'arrayTest[1]'; echo eval('return $'.$arrayVarTest.';'); eval('echo $'.$arrayVarTest.';'); 

То есть, если вы очень уверены в том, что будет вкладом.

Предварительная обработка:

 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);