2014-07-25 5 views
2

Я хочу превратить простую строку как «response-> dict-> words» в имя переменной, с которой я действительно могу работать. Сейчас я приведу пример. Предположим, что значение $response->dict->words is 67.Преобразовать строку в объект-переменную-имя?

Пример:

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

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

Как вы можете заметить, я поставил дополнительный знак доллара перед $ вар, потому что это должно работать, но это не так.

Может ли кто-нибудь помочь мне с этим?

+3

Здесь вы должны использовать 'Eval()' вместо переменных величин или что-то подобное, но вы лучше перестройте свою логику. Не нужно создавать вызов string -> object. –

ответ

-4

Существует лучший способ, почему вы не кэшировать переменную как

 $var = $response->dict->words; 
+2

, потому что у него нет переменной, но строка –

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

+0

i до сих пор не получила использования $ call = $ call -> $ element –

 Смежные вопросы

  • Нет связанных вопросов^_^