Можно ли создать переменную переменную, указывающую на массив или на вложенные объекты? В 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});
Я пропустил что-то очевидное здесь?
Элемент массива :
$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);