我想把一个简单的字符串像"response->dict->words"变成一个变量名,我可以实际使用。我现在举个例子。假设$response->dict->words is 67
的值
的例子:
$var = "response->dict->words"
echo $$var; /* PRINT THE VALUE 67 FROM $response->dict->words*/
正如你可能注意到的,我在$var前面加了一个额外的美元符号,因为这应该可以工作,但它没有。
有谁能帮我一下吗?class ClassOne {
public function test() {
return 'test';
}
}
class ClassTwo {
public function test2() {
return 'test2';
}
}
$one = new ClassOne();
$two = new ClassTwo();
$objects = array('one', 'two');
$methods = array('test', 'test2');
for ($i = 0; $i < count($objects); $i++) {
echo ${$objects[$i]}->$methods[$i]();
}
您可以将类名或方法名存储为字符串,稍后再使用它们,甚至可以存储变量名,例如这里的${$objects}
(可变变量),但您不能存储整个逻辑。
要评估整个逻辑,你必须使用eval()
,这很可能是坏主意
$var = "response->dict->words"
eval("?> <?php echo $".$var.";");
你可以拆分你的字符串并进行如下调用:
class Response {
public $dict;
public function __construct() {
$this->dict = new stdClass();
$this->dict->words = 'words test';
}
}
$response = new Response();
$var = 'response->dict->words';
$elements = explode('->', $var);
echo ${$elements[0]}->$elements[1]->$elements[2];
结果进入words test
或者,如果不知道对象调用的嵌套级别,可以在foreach循环中执行调用。当循环退出时,最后一个调用将在它之后可用:
class Response {
public $dict;
public function __construct() {
$this->dict = new stdClass();
$this->dict->words = new stdClass();
$this->dict->words->final = 'test chained string';
}
}
$response = new Response();
$var = 'response->dict->words->final';
$elements = explode('->', $var);
foreach ($elements as $key => $element) {
if ($key == 0) {
$call = ${$element};
continue;
}
$call = $call->$element;
}
echo $call;
Results into: test chained string
有一个更好的方法,为什么不像
那样缓存变量呢? $var = $response->dict->words;