是否可以创建指向数组或嵌套对象的变量变量? php文档具体说你不能指向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});
我错过了一些明显的东西吗?
答案 0 :(得分:5)
数组元素方法:
$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});
有效!
答案 1 :(得分:1)
使用= &
按引用分配:
$arrayTest = array('value0', 'value1');
$arrayVarTest = &$arrayTest[1];
$arrayTest[1] = 'newvalue1'; // to test if it's really passed by reference
print $arrayVarTest;
答案 2 :(得分:0)
在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是邪恶的。 ; - )
答案 3 :(得分:0)
不,你不能这样做。您只能使用变量,对象和函数名称来执行此操作。
示例:
$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);
答案 4 :(得分:0)
对于许多嵌套级别有一种动态方法:
$attrs = ['level1', 'levelt', 'level3',...];
$finalAttr = $myObject;
foreach ($attrs as $attr) {
$finalAttr = $finalAttr->$attr;
}
return $finalAttr;