我想把一个像“response-> dict-> words”这样的简单字符串变成一个我可以实际使用的变量名。我现在举个例子。让我们假设$response->dict->words is 67
。
示例:
$var = "response->dict->words"
echo $$var; /* PRINT THE VALUE 67 FROM $response->dict->words*/
您可能会注意到我在$ var之前添加了一个额外的美元符号,因为这应该有效,但事实并非如此。
任何人都可以帮我吗?
答案 0 :(得分:5)
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;
结果:test chained string
答案 1 :(得分:-4)
有一种更好的方法,为什么不缓存像
这样的变量 $var = $response->dict->words;