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

时间:2014-07-25 14:03:05

标签: php string variables

我想把一个像“response-> dict-> words”这样的简单字符串变成一个我可以实际使用的变量名。我现在举个例子。让我们假设$response->dict->words is 67

的值

示例:

$var = "response->dict->words"

echo $$var; /* PRINT THE VALUE 67 FROM $response->dict->words*/

您可能会注意到我在$ var之前添加了一个额外的美元符号,因为这应该有效,但事实并非如此。

任何人都可以帮我吗?

2 个答案:

答案 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;