将字符串转换为对象-变量-名称


Convert String To Object-Variable-Name?

我想把一个简单的字符串像"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;