В принципе, вы можете это сделать, но вы должны положить паренс снаружи.
$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};