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