指向数组或嵌套对象的变量
-
19-09-2019 - |
题
是否可以创建一个指向数组或嵌套对象的变量?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});
我在这里遗漏了一些明显的东西吗?
解决方案
数组元素方法:
- 从字符串中提取数组名称并将其存储在
$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);
不隶属于 StackOverflow