Я пытаюсь настроить оператор на основе переменных на PHP, но я могу только выполнить то, что я ищу в ограниченной степени. Например, следующий код допускает выбор переменной:
$var1 = 'available_from'; $keyValuePairs[$key] = $item->parent()->{$var1};
Однако, если я хочу также сделать родительский селектор переменной, я больше не могу этого делать. Оба следующих метода не выполняются:
$var1 = 'parent()->available_from'; $keyValuePairs[$key] = $item->{$var1};
а также
$var1 = 'parent()'; $var2 = 'available_from'; $keyValuePairs[$key] = $item->{$var1}->{$var2};
Поэтому вопрос заключается в том, есть ли способ сделать это.
Вы можете это сделать в основном, но вы должны поставить parens снаружи.
$var1 = 'parent'; $var2 = 'available_from'; $keyValuePairs[$key] = $item->{$var1}()->{$var2}; // or $keyValuePairs[$key] = $item->$var1()->{$var2};
И в принципе нет возможности обойти это без использования eval:
// escape the first $ $keyValuePairs[$key] = eval( "\$item->$var1->$var2" );
Но нет смысла использовать eval, если у вас есть доступ к потенциальному набору переменных.
Вы можете сделать что-то подобное, чтобы обойти это:
function call_or_return( $obj, $prop ) { // test to see if it is a method (you'll need to remove the parens first) $arr = array( $obj, $prop ); // if so call it. if( is_callable( $arr ) ) return call_user_func( $arr ); // otherwise return it as a property return $obj->$prop; } call_or_return( $item, $var1 )->{$var2};