Переменные в объектных операторах - PullRequest
5 голосов
/ 24 июля 2011

Я пытаюсь настроить объектный оператор на основе переменных в 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};

Поэтому вопрос заключается в том, существует ли способ сделать это.

1 Ответ

17 голосов
/ 24 июля 2011

В принципе, вы можете это сделать, но вы должны положить паренс снаружи.

$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};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...